Controls & camera

Camera framing

camera-framing-1

Tests included

This contract defines the behaviour of cameras: a follow camera, a fixed view, or a free camera.

It decides what each camera must keep on screen, what may push it off screen, such as zoom, and what happens then.

Use in your game

Opens the authoring tool with this contract added and its questions unanswered. Or download the ZIP and add it later.

What is in the ZIP

The ZIP holds the contract and its acceptance tests. In the authoring tool, choose Add contract and pick this ZIP. If you keep your design as files, put them in contracts/ and fill in the answers there.

Questions

1 question.

  1. In normal play, must these cameras keep anything from your game on screen?

Try the answers

Pick answers to see which rules and tests apply. Nothing is saved here: the ZIP and the authoring tool start unanswered.

In normal play, must these cameras keep anything from your game on screen?

Choices for In normal play, must these cameras keep anything from your game on screen?
The cameras keep named game content visible. A party view keeps every active hero on screen.

Every visibility promise lives in a coverage-promises row and every effect on one lives in a camera-activities row; nothing outside those rows is promised.

The cameras make no promise about game content staying visible. An endless runner may leave the view during a fast fall.

No visibility promise exists; the promise and activity row sets are declared empty.

Why this is asked

A follow target or camera travel limit does not prove that game content remains visible. This choice states whether these cameras make that promise.

Lists3 lists

Some settings are lists of rows.

A reference points to a number or a rule in your design. For a number, use its address in your tuning. For a rule, use its file and heading, such as 02-mechanics.md#recovery. Each field's description says what it needs.

Cameras

cameras

The play views in this camera family and the rules that move or limit each one.

An empty list means: An adoption without a camera row describes no play view, and a reviewer rejects it.

Each row is: id, active-when, view-declared-in, follow-mode, follow-target-declared-in, manual-pan, pan-actions-declared-in, recenter-action-declared-in, travel-limit, travel-limit-declared-in, view-size, view-size-rule-declared-in, failure-response, failure-handling-declared-in.

Every field
FieldKindWhen it appearsMeaning
id string Required A stable camera name in game language, such as board-camera or tactical-view.
active-when reference Required The complete rule for when this camera supplies a displayed play view.
view-declared-in reference Required The rule naming this camera's final play region, aspect handling, and display sizes. For a fixed view it also names the authored base position; for a fixed size it also names the authored view size.
follow-mode choice: fixed-view, locked-follow, slack-follow, free-view, free-with-recenter Required A fixed room view's base position never moves or follows anything, and no input moves it; only a declared activity can offset it. Locked follow keeps a hero at the centre. Slack follow lets a runner move before the view follows. A free tactical view begins where the player moves it. A free map with recenter can return to a selected group.
follow-target-declared-in reference Present when row follow mode is Locked follow or Slack follow or Free with recenter. The rule naming the followed target or the target used by recenter. For slack follow it also names the allowed positions around that target.
manual-pan choice: edge-scroll, drag-view, move-view-actions, several-methods Present when row follow mode is Free view or Free with recenter. Edge scroll moves a strategy view at the screen edge. Drag view pulls a mission map. Move-view actions pan a tactics camera through mapped actions. Several methods gives a world map at least two of these.
pan-actions-declared-in reference Present when row follow mode is Free view or Free with recenter. The game actions that pan this camera. Several methods names at least two methods; platform inputs stay with Control options.
recenter-action-declared-in reference Present when row follow mode is Free with recenter. The game action that returns this view to its cited target.
travel-limit choice: no-camera-travel-limit, one-world-region, changes-by-situation Present when row follow mode is Locked follow or Slack follow or Free view or Free with recenter. No limit lets a runner view keep moving. One region keeps a board view inside its room. Situation changes can give a tactical map different regions by mission phase. A fixed view travels nowhere and is not asked.
travel-limit-declared-in reference Present when row travel limit is One world region or Changes by situation. The complete camera-position region and, when needed, the rule selecting the current region.
view-size choice: fixed-size, player-held-zoom, automatic-fit Required Fixed size keeps a runner at its authored view size. Player-held zoom lets a strategy player hold a chosen zoom level. Automatic fit widens a co-op view until the party and margins fit.
view-size-rule-declared-in reference Present when row view size is Player held zoom or Automatic fit. For player-held zoom, the zoom actions and allowed range. For automatic fit, the allowed range, aspect response, update timing, and simultaneous-promise rule.
failure-response choice: hold-valid-frame, keep-priority-content, show-framing-failure, change-world-to-restore-frame, failure-unreachable Present when Content visibility is Declared content. Hold valid frame leaves a puzzle transition on its last valid view. Keep priority content protects a tactics leader and records hidden allies as failed. Show framing failure adds a warning to a strategy view. Change world to restore frame applies a co-op tether or defeat rule. Failure unreachable cites why a fixed arena fits on every reachable display.
failure-handling-declared-in reference Present when Content visibility is Declared content. The exact wait, priority, warning, or game rule used after failure, or the complete argument that failure cannot be reached.

Coverage promises

coverage-promises

The subjects or areas each camera keeps visible in named play situations.

An empty list means: No camera in this adoption promises to keep game content visible.

Each row is: id, camera-id, subject, applies-when, coverage, reference-point, visibility-area, safe-area-declared-in, margin-declared-in.

Every field
FieldKindWhen it appearsMeaning
id string Required A stable promise name in game language, such as whole-board or selected-group.
camera-id string Required The camera that keeps this promise, by the name you gave it.
subject reference Required The Fixed game prose naming the subject or area that stays visible.
applies-when reference Required The complete play conditions in which this promise applies.
coverage choice: whole-extent, reference-point Required Whole extent keeps every edge of a selected squad visible. Reference point keeps a runner's cited centre visible even when the sprite reaches past the view.
reference-point reference Present when row coverage is Reference point. The exact point that stays visible.
visibility-area choice: rendered-view, hud-safe-area Required Rendered view measures a runner from the final view edges, so HUD overlap alone does not fail. HUD safe area measures a tactics objective from the cited unobscured area, so HUD-covered space counts outside.
safe-area-declared-in reference Present when row visibility area is HUD safe area. The final unobscured rectangle or shape after the HUD elements named by this promise's conditions are placed.
margin-declared-in reference Required The top, right, bottom, and left clearance inside the chosen visibility area, with units. Zero is stated explicitly. A camera clamped at its travel limit may hold less than this clearance on the clamped side, but the subject still stays inside the area.

Camera activities

camera-activities

Frame-changing situations and whether each one keeps or suspends all or named promises on its camera.

An empty list means: No camera activity has a visibility-promise effect in this adoption. With declared content, the promise-bearing cameras use none of the seven listed activities.

Each row is: id, camera-id, activity-kind, applies-when, extent-declared-in, actions-declared-in, promises, promise-effect.

Every field
FieldKindWhen it appearsMeaning
id string Required A stable activity name in game language, such as sprint-look-ahead or boss-hit-shake.
camera-id string Required The camera this activity changes, by the name you gave it.
activity-kind choice: look-ahead, manual-pan, aim-or-peek-offset, player-zoom, shake, temporary-zoom, scripted-move Required Look-ahead leads a runner. Manual pan moves a tactical view. Aim or peek offsets a follow camera toward a target. Player zoom holds a strategy view at a chosen size. Shake offsets a boss hit. Temporary zoom changes a combat view's size. A scripted move frames a dialogue reveal.
applies-when reference Required The complete start and end conditions for this camera activity.
extent-declared-in reference Present when row activity kind is Look ahead or Aim or peek offset or Shake or Temporary zoom or Scripted move. The rule naming this activity's strongest displacement or size change. Manual pan is bounded by the travel limit and controller instead; player zoom is bounded by the view-size citation.
actions-declared-in reference Present when row activity kind is Aim or peek offset. The game actions that produce this offset. Platform inputs stay with Control options.
promises reference Optional The fixed list of promise names affected by this activity. When absent, the activity affects every promise on its camera.
promise-effect choice: keeps-promise, may-suspend Required Keeps promise preserves the affected rows, as when runner look-ahead stays inside its margin. May suspend allows those rows to fail only for this activity, as during a boss reveal.

For builders

Exact mechanism wording and 51 pack tests

Exact mechanism wording

This is the single normative authority for each displayed play moment: which camera is active, what must remain visible, who moves the view, what may suspend a promise, how travel and view size are applied, what happens when content cannot fit, and when a suspended promise returns. Questions and rows supply choices and cited game rules; they do not define another order.

A displayed play moment is the final play image presented at one moment, after follow motion, manual pan, aim or peek offset, player-held zoom, shake, temporary zoom, scripted movement, viewport scaling, and HUD composition. A play region is the screen area named by view-declared-in; two regions are the same region whenever their screen areas overlap at all. A coverage row's visibility area is either the final rendered play region or that row's cited HUD-safe area. A valid frame satisfies every applicable, unsuspended coverage row at its settled margin. A framing failure exists only when no camera position and view size allowed by the camera can produce a valid frame.

### Select the view and promises

1. Read every camera whose active-when rule holds. Each active camera supplies the final play region named by view-declared-in. At most one camera may be active in one play region. Simultaneous split views settle independently only when their regions are distinct. 2. For each active camera, collect its coverage rows whose applies-when rules hold. whole-extent contributes the subject's complete displayed extent. For a set-valued subject, the whole extent is the union of its members' displayed extents. reference-point contributes only the cited point. 3. Construct each row's visibility area after display scaling and the HUD placement named by that row's conditions. HUD-covered space is outside a HUD-safe area; a rendered-view row deliberately ignores HUD overlap. Inset the area by the cited top, right, bottom, and left margin. Attach the one contract-supplied edge condition: a later travel clamp may reduce only the margin on its clamped side, never the underlying visibility area. A whole extent fits only when all of it lies inside the settled inset area. A reference point fits when that point lies inside it. A subject or point lying exactly on the boundary of the settled inset area fits.

### Apply activity permissions

4. Read every active activity row for the camera. Its promises citation, when present, selects the affected applicable promises; when absent, it selects every applicable promise on that camera. An active may-suspend row suspends only that set for its cited interval. Active keeps-promise rows do not cancel a different active suspension affecting the same promise. 5. A suspended promise is not tested and cannot create a framing failure. It becomes required again on the first displayed play moment after the last suspending activity affecting it ends. On a free-with-recenter camera, a suspending manual-pan interval begins when the view leaves its recentered state and ends on recenter or camera deactivation. 6. The player proposes motion and held zoom through the cited game actions; the camera controller disposes of the final frame. free-view and free-with-recenter name who initiates position changes, not who owns the displayed result. A keeps-promise manual-pan or aim-or-peek row therefore requires the controller to stop, redirect, or resize the proposed view before an affected promise fails.

### Build and test the frame

7. Build the candidate position in two stages. Stage one selects the base position inside the follow mode's set. A fixed view has only the base position named by view-declared-in. A locked follow has only its target point. A slack follow may use the allowed positions its citation names around the target. A free view starts from the player's proposal; a free-with-recenter view does the same until recenter selects its target point. The controller may search only within the set supplied by that mode. Apply any travel limit to the base position; a fixed view declares none. It constrains camera position, not the visible region, and it never proves that a subject is visible. Resolve the step-3 edge condition now: when this clamp alone prevents the subject from meeting a margin, reduce only the clamped-side margin by the exact shortfall, no lower than zero. The subject must still lie inside the underlying, uninset visibility area. Stage two applies each active position-changing activity as an offset to the settled base, bounded by its cited extent. An activity offset is outside the mode's search set and may carry the view past the travel limit; the final test in step 9 still decides every promise. 8. Settle view size once. fixed-size uses the size named by view-declared-in. player-held-zoom starts from the player's held level inside the cited range; its player-zoom activity row's effect decides whether the controller must keep every promise or may let the named ones suspend; with no such row, the controller must keep every applicable promise at every held level. automatic-fit applies the cited fit rule, choosing the largest allowed size at which the extent, the margins, the strongest cited displacement of every position-changing keeps-promise activity, and the largest cited size of every size-changing one fit together. On any view-size answer, an active temporary-zoom activity may propose its cited extent as a temporary size; an accepted temporary size replaces the size the answer would otherwise settle, for the activity's cited interval, and the authored size, held level, or fit result returns on the first displayed moment after it ends. The controller disposes of every proposal under the activity permission and all unsuspended promises together. The travel region still binds camera position only: if fitting needs a centre outside it, clamp the centre and continue fitting inside the allowed zoom range, even when the visible region extends beyond the travel region. If no allowed size and clamped position fits, step 11 applies. 9. Compose the final view and HUD, then test every unsuspended promise against its inset visibility area. This final test decides the outcome; a follow trigger, recenter action, camera travel limit, or earlier candidate frame never substitutes for it. 10. If every row passes, display the valid frame. A keeps-promise activity is demonstrated only when this final test passes on every displayed moment of its cited interval, including the strongest displacement or size change its extent citation names.

### Settle a framing failure and recovery

11. Only after no allowed candidate can pass, create one framing failure containing the camera id, failed promise ids, display size, visibility areas, settled margins, attempted position and view size, travel limit, active activities, and selected failure response. A failure response is not an ordinary precondition and cannot weaken a coverage row before this step. 12. hold-valid-frame does not display the invalid candidate. It keeps the last valid displayed frame or, before one exists, the cited non-play transition surface; the cited game rule decides whether play or a transition advances. keep-priority-content applies the cited total priority, displays the best allowed frame, and records each promise that did not fit. show-framing-failure displays the best allowed frame with its cited player-facing failure state. change-world-to-restore-frame applies the cited game rule to tether, defeat, or move content, then reruns steps 2–10 before another play moment is displayed; the cited rule may not change the active camera set or create a play region. failure-unreachable declares no runtime handling: reaching this step contradicts its cited argument and invalidates the design claim. 13. A failure remains a failure until a later settlement produces a valid frame or the camera deactivates. Priority, a visible notice, or starting a cited world change does not by itself turn an invalid frame into a kept promise. 14. When a suspension ends, run steps 2–10 before displaying the next play moment. The first displayed moment without an active suspension must be valid or must enter steps 11–13. At a camera handover, run steps 1–10: the incoming camera brings its own promise set and visibility areas, and its first frame follows this same first-valid-frame recovery path. Switching cannot insert an unchecked frame or leave two cameras active in one region.

The authority order is therefore: active play region, applicable promise, each coverage row's visibility area and margin, activity suspension, player proposal and controller disposal, camera-position travel limit, allowed position and view-size settlement, final composed-view test, failure response. Later stages never rewrite an earlier declaration.

Verification pack

sha256:4caf436eee5950d06c4368a78c14f9c4bff965e124c8d84695700ba82e2e7129

The format calls an adoption with its matching pack Checked: the tests travel with it, but a game has not necessarily passed them. Without the pack the adoption is Promised: the builder still owes the chosen behavior.

51 pack tests

Placeholders are filled from the adoption's answers, values, rows, and verification inputs.

the framing vocabulary is observed at the displayed result

framing-vocabulary-is-observable

scenarioonce

Applies for every adoption

This test fixes two observable meanings. A displayed play moment is the final play image after every listed camera change, scaling, and HUD composition. Any overlap makes two screen areas one play region.

Given

a trace of camera settlement and displayed output for Instance

When
  • displayed play moments and play regions are classified
Then
  • each displayed play moment is the final play image after follow motion, manual pan, aim or peek offset, player-held zoom, shake, temporary zoom, scripted movement, viewport scaling, and HUD composition
  • two play regions are treated as one region whenever their screen areas overlap at all
Diagnostics
  • Instance-displayed-frame-log
  • Instance-active-camera-trace
  • Instance-candidate-trace
valid frames and framing failures are observable

declared-content-framing-outcomes-are-observable

scenarioonce

Applies when Content visibility is Declared content.

For declared content, a valid frame satisfies every applicable unsuspended coverage row at its settled margin. A framing failure exists only after every allowed position and size has failed.

Given

a trace of composed views and failure settlement for Instance

When
  • valid frames and framing failures are classified
Then
  • a frame is valid exactly when every applicable unsuspended coverage row fits at its settled margin
  • a framing failure is recorded only when no position and view size allowed by the camera can produce a valid frame
Diagnostics
  • Instance-failure-record
Row.id supplies its region exactly while active

camera-supplies-region-while-active

scenarioper cameras row

Applies for every adoption

Camera Row.id supplies exactly the play region cited at Row.view declared in, and only while the rule cited at Row.active when holds. The test names both addresses and restates nothing from them.

Given

camera row Row.id and the rules cited at Row.active when and Row.view declared in

When
  • the active-camera trace crosses both edges of the rule cited at Row.active when
Then
  • Row.id supplies exactly the play region cited at Row.view declared in while Row.active when holds
  • Row.id supplies no play region while Row.active when does not hold
Diagnostics
  • Instance-active-camera-trace
  • Instance-displayed-frame-log
active cameras occupy exclusive play regions

active-regions-are-exclusive

scenarioonce

Applies for every adoption

At most one camera is active in one play region. Overlap is the whole test; how two areas are composited is outside this contract. No pair settles independently unless its play regions are distinct, and each distinct camera's settlement and promise results remain independent. Where the adoption can activate no pair, there is no pair behavior to assert.

Given

every pair of cameras that Instance can activate at the same displayed play moment; an adoption with no such pair asserts only the no-pair result

When
  • their play regions are compared after display scaling
Then
  • no pair is active where the two screen areas overlap at all; a violating pair is a defect this test fails by construction
  • no pair settles independently unless its play regions are distinct; where they are distinct, each camera's base position, settled view size, suspensions, and promise results are recorded per camera and no value of one is a function of the other's
  • an adoption that can activate no pair has no simultaneous-region settlement to assert
Diagnostics
  • Instance-active-camera-trace
  • Instance-play-region-map
  • Instance-candidate-trace
  • Instance-settled-margin-record
  • Instance-suspension-log
Row.id applies exactly when its cited rule holds

promise-applies-exactly-when-cited

scenarioper coverage-promises row

Applies for every adoption

Promise Row.id on Row.camera id applies exactly while the rule cited at Row.applies when holds. Outside that interval it is not tested and cannot create a framing failure. The test names the address and restates nothing from it.

Given

coverage-promises row Row.id for Row.camera id

When
  • the trace crosses both edges of the rule cited at Row.applies when
Then
  • Row.id enters the applicable promise set exactly while Row.applies when holds
  • outside that interval Row.id is not tested and cannot create a framing failure
Diagnostics
  • Instance-visibility-area-trace
  • Instance-failure-record
the whole extent of Row.id remains inside its visibility area

whole-extent-stays-visible

generalper coverage-promises row

Applies when row coverage is Whole extent.

The whole extent of Row.id, the subject named at Row.subject, remains inside this row's own visibility area at its settled margin on every displayed play moment where the promise is applicable and unsuspended, except on a displayed play moment that has entered failure settlement, where this row is recorded as failed rather than kept. For a set-valued subject, the whole extent is the union of its members' displayed extents. The suspension log shows whether each moment tested this row or left it untested.

Holds

on every displayed play moment when Row.id is applicable and unsuspended, the complete displayed extent of the subject named at Row.subject remains inside this row's visibility area at its settled margin, except on a displayed play moment that has entered failure settlement, where this row is recorded as failed rather than kept; when the subject is set-valued, that complete extent is the union of its members' displayed extents; the suspension log shows whether each moment tested this row or left it untested

Seeds

Inputs seeds

Scope

Inputs scope

Diagnostics
  • Instance-displayed-frame-log
  • Instance-visibility-area-trace
  • Instance-suspension-log
  • Row.id-displayed-extent
the declared point for Row.id remains inside its visibility area

reference-point-stays-visible

generalper coverage-promises row

Applies when row coverage is Reference point.

The reference point named at Row.reference point for Row.id, the subject named at Row.subject, remains inside this row's own visibility area at its settled margin on every displayed play moment where the promise is applicable and unsuspended, except on a displayed play moment that has entered failure settlement, where this row is recorded as failed rather than kept. This row promises nothing about the rest of the subject. The suspension log shows whether each moment tested this row or left it untested. The test names the addresses and restates nothing from them.

Holds

on every displayed play moment when Row.id is applicable and unsuspended, the point named at Row.reference point for the subject named at Row.subject remains inside this row's visibility area at its settled margin, except on a displayed play moment that has entered failure settlement, where this row is recorded as failed rather than kept; no other part of the subject is required to fit by this row; the suspension log shows whether each moment tested this row or left it untested

Seeds

Inputs seeds

Scope

Inputs scope

Diagnostics
  • Instance-displayed-frame-log
  • Instance-visibility-area-trace
  • Instance-suspension-log
  • Row.id-reference-point
Row.id uses the rendered play region

rendered-view-defines-visibility-area

scenarioper coverage-promises row

Applies when row visibility area is Rendered view.

Promise Row.id uses the final rendered play region supplied by Row.camera id as its visibility area. HUD overlap alone is ignored for this row.

Given

applicable unsuspended promise Row.id after display scaling and HUD composition

When
  • its visibility area is constructed
Then
  • the visibility area is the final rendered play region supplied by Row.camera id
  • HUD overlap alone removes no space from this visibility area
Diagnostics
  • Instance-visibility-area-trace
  • Instance-hud-composition-log
Row.id uses its cited HUD-safe area

hud-safe-area-defines-visibility-area

scenarioper coverage-promises row

Applies when row visibility area is HUD safe area.

Promise Row.id uses the final unobscured shape cited at Row.safe area declared in after scaling and the HUD placement named by its conditions. HUD-covered space is outside it. The test names the address and restates nothing from it.

Given

applicable unsuspended promise Row.id after display scaling and the HUD placement named by its conditions

When
  • its visibility area is constructed
Then
  • the visibility area is the final unobscured shape cited at Row.safe area declared in
  • HUD-covered space is outside that visibility area
Diagnostics
  • Instance-visibility-area-trace
  • Instance-hud-composition-log
Row.id insets its visibility area by four margins

margin-insets-the-visibility-area

scenarioper coverage-promises row

Applies for every adoption

The four clearances with units cited at Row.margin declared in inset Row.id's visibility area. A subject or reference point exactly on the inset boundary fits. The test names the address and restates nothing from it.

Given

promise Row.id, its visibility area, and the four clearances with units cited at Row.margin declared in

When
  • the margin is inset
Then
  • the top, right, bottom, and left clearances from Row.margin declared in inset the visibility area
  • a subject or reference point exactly on the boundary of the inset area fits
Diagnostics
  • Instance-visibility-area-trace
  • Instance-settled-margin-record
Row.id affects exactly its selected promises

activity-selects-affected-promises

scenarioper camera-activities row

Applies for every adoption

Activity Row.id affects exactly the applicable promises selected for Row.camera id. Where this row cites a promises list, that fixed list is exact; where it cites none, every applicable promise on Row.camera id is affected. The test names no list contents and restates nothing from the citation.

Given

active activity row Row.id on Row.camera id, the fixed promise list this row cites in its promises field, when it has one, and every applicable promise on that camera

When
  • the activity's affected set is built
Then
  • where this row cites a promises list, the affected promises are exactly the ones it names
  • where it cites no promises list, the affected set is every applicable promise on Row.camera id
  • the affected-promise-set record names each promise the citation lists, or every applicable promise on Row.camera id when the row cites none
  • the selection record distinguishes an unaffected promise from an affected promise that happened not to change
Diagnostics
  • Instance-activity-log
  • Instance-affected-promise-set
Row.id suspends only its affected promises

may-suspend-releases-and-restores-promises

scenarioper camera-activities row

Applies when row promise effect is May suspend.

Activity Row.id releases only its affected promises, and only during the interval cited at Row.applies when. A suspended promise is not tested and cannot create a framing failure. It holds again on the first displayed play moment after its last affecting suspension ends. The log distinguishes an untested promise from one that happened to fit. The test names the address and restates nothing from it.

Given

activity Row.id and its affected applicable promises

When
  • the interval cited at Row.applies when begins and then the last suspending activity affecting each promise ends
Then
  • only the affected set is suspended during Row.id's active interval
  • each suspended promise is not tested and cannot create a framing failure during that interval
  • each promise is required again on the first displayed play moment after its last affecting suspension ends
  • the suspension log distinguishes a promise that was not tested from one that happened to fit
Diagnostics
  • Instance-suspension-log
  • Instance-displayed-frame-log
  • Instance-failure-record
Row.id keeps its promise without cancelling another suspension

keeps-promise-preserves-other-suspensions

scenarioper camera-activities row

Applies when row promise effect is Keeps promise.

Activity Row.id supplies no suspension of its own. If another active activity suspends the same promise, Row.id does not cancel it; where this adoption cannot construct that overlap, the overlap clause asserts nothing. The interval comes from Row.applies when, whose content this test does not restate.

Given

active keeps-promise activity Row.id and each overlap with another active suspending activity on the same promise that Instance can construct; where no overlap can be constructed, the overlap clause asserts nothing

When
  • the final promise set is tested during Row.id's interval cited at Row.applies when
Then
  • Row.id supplies no suspension of its own
  • a different active suspension affecting the same promise remains active until its own interval ends
Diagnostics
  • Instance-suspension-log
  • Instance-activity-log
suspending manual pan uses the recentered interval

recenter-manual-pan-defines-suspension-interval

scenarioper camera-activities row

Applies when row promise effect is May suspend and row activity kind is Manual pan.

Where may-suspend manual-pan activity Row.id is on a free-with-recenter camera, its suspension begins when the view leaves the recentered state and ends on recenter or camera deactivation; an activity row cannot read its camera's follow mode, so a non-recentering camera asserts nothing.

Given

each case this adoption can construct where Row.camera id is free-with-recenter; an activity row cannot read its camera's follow mode, so a non-recentering camera asserts nothing

When
  • the player moves the view away from the recentered state and later recenters or deactivates the camera
Then
  • the suspending interval begins when the view leaves the recentered state
  • the interval ends on recenter or camera deactivation
Diagnostics
  • Instance-suspension-log
  • Instance-candidate-trace
  • Instance-active-camera-trace
the controller disposes of kept player proposals

controller-disposes-of-kept-player-proposals

scenarioper camera-activities row

Applies when row promise effect is Keeps promise and row activity kind is Manual pan or Aim or peek offset.

For keeps-promise activity Row.id, the controller stops, redirects, or resizes a player proposal before an affected promise fails. The player proposes and the controller disposes; the proposal never owns the displayed result.

Given

each proposal this adoption can construct for Row.id

When
  • the proposal would make an affected promise fail
Then
  • the controller stops, redirects, or resizes the proposed view before the affected promise fails
  • the player proposes and the controller disposes; the player's proposal never owns the displayed result
Diagnostics
  • Instance-player-proposal-log
  • Instance-controller-disposal-log
  • Instance-displayed-frame-log
a camera without an activity builds from its base alone

camera-without-activity-uses-base-alone

scenarioonce

Applies for every adoption

For each active camera and moment with no active camera-activities row, the candidate is built from the settled base position alone and has no activity offset. If this adoption has no such moment, the test asserts nothing.

Given

each active camera and displayed play moment for which Instance has no active camera-activities row; if every active camera has an activity, this test asserts nothing

When
  • the candidate position is built
Then
  • the candidate has the settled base position and no activity offset
Diagnostics
  • Instance-candidate-trace
  • Instance-activity-log
Row.id uses only its authored base position

fixed-view-uses-authored-base

scenarioper cameras row

Applies when row follow mode is Fixed view.

Fixed-view camera Row.id has one base position, named at Row.view declared in. No player input moves it; only a declared activity can add an offset. The test names the address and restates nothing from it.

Given

active fixed-view camera Row.id

When
  • its base position is selected and player inputs are offered
Then
  • the set this follow mode supplies contains only the base position named at Row.view declared in
  • no player input moves that base position; only a declared activity can add an offset
Diagnostics
  • Instance-candidate-trace
  • Instance-player-proposal-log
Row.id follows only its cited target point

locked-follow-uses-target-point

scenarioper cameras row

Applies when row follow mode is Locked follow.

Locked-follow camera Row.id has only the target point cited at Row.follow target declared in in the set this follow mode supplies. That point becomes the base before the travel limit is applied. The test names the address and restates nothing from it.

Given

active locked-follow camera Row.id and the target point cited at Row.follow target declared in

When
  • the base position is selected
Then
  • the set this follow mode supplies contains only that cited target point
  • the selected base position is that point before the travel limit is applied
Diagnostics
  • Instance-candidate-trace
  • Instance-follow-target-trace
Row.id stays in its cited slack set

slack-follow-stays-in-allowed-set

scenarioper cameras row

Applies when row follow mode is Slack follow.

Slack-follow camera Row.id selects only positions inside the allowed set around its target cited at Row.follow target declared in. It never searches outside that set. The test names the address and restates nothing from it.

Given

active slack-follow camera Row.id and the target and allowed positions cited at Row.follow target declared in

When
  • the controller selects a base position across target motion and direction changes
Then
  • every selected base position lies inside the cited allowed set around the target before the travel limit is applied
  • the controller searches no position outside that set
Diagnostics
  • Instance-candidate-trace
  • Instance-follow-target-trace
Row.id starts from its player pan proposal

free-camera-starts-from-player-pan

scenarioper cameras row

Applies when row follow mode is Free view or Free with recenter.

Camera Row.id begins from Bind pan method through the actions cited at Row.pan actions declared in. Only those cited actions produce this camera's pan proposal. This says who initiates movement, not who owns the result: the controller still disposes of the displayed frame. The test names the address and restates nothing from it.

Given

active free camera Row.id receiving Bind pan method through the actions cited at Row.pan actions declared in

When
  • the mode selects its base proposal
Then
  • the mode begins from the player's proposed position
  • the controller searches only positions supplied by this free-camera mode and still disposes of the displayed result
  • only the game actions cited at Row.pan actions declared in produce this camera's pan proposal
Diagnostics
  • Instance-player-proposal-log
  • Instance-controller-disposal-log
  • Instance-candidate-trace
Row.id returns to its cited target on recenter

free-with-recenter-selects-target

scenarioper cameras row

Applies when row follow mode is Free with recenter.

Free-with-recenter camera Row.id starts from player proposals until the action cited at Row.recenter action declared in selects the target cited at Row.follow target declared in. The test names both addresses and restates nothing from them.

Given

active free-with-recenter camera Row.id, target rule Row.follow target declared in, and recenter action Row.recenter action declared in

When
  • the player pans and then invokes the cited recenter action
Then
  • the mode starts from player proposals until recenter
  • recenter selects the target point cited at Row.follow target declared in as the new base proposal
Diagnostics
  • Instance-player-proposal-log
  • Instance-candidate-trace
  • Instance-follow-target-trace
Row.id applies no camera travel clamp

no-travel-limit-does-not-clamp

scenarioper cameras row

Applies when row travel limit is No camera travel limit.

Camera Row.id has no camera travel clamp. Its base position passes this stage unchanged.

Given

camera Row.id with base proposals across the set this follow mode supplies

When
  • the travel-limit stage settles the base position
Then
  • no camera travel clamp changes the base position
Diagnostics
  • Instance-candidate-trace
Row.id clamps its base position to the cited region

travel-limit-clamps-base-position

scenarioper cameras row

Applies when row travel limit is One world region or Changes by situation.

Camera Row.id clamps its base position to Bind region selection cited at Row.travel limit declared in. The limit constrains camera position, not the visible region.Bind region change text A promise not tested by the final composed-view test is not recorded as kept. Its edge condition reduces only the clamped-side margin by the exact shortfall, never below zero, while the subject still stays inside the underlying area; the margin record distinguishes that thinning from an ordinary fit. The test names the address and restates nothing from it.

Given

camera Row.id, base proposals inside and outside Bind region selection cited at Row.travel limit declared in, and a subject near each region edge

When
  • the travel limit is applied before activity offsets Bind region change
Then
  • the base position is clamped to Bind region selection
  • the clamp constrains camera position, not the visible region
  • a promise not tested by the final composed-view test is not recorded as kept
  • where the clamp alone prevents the subject from meeting a margin, the clamped-side margin is reduced by the exact shortfall and no lower than zero, while the subject remains inside the underlying uninset visibility area
  • the margin-settlement record distinguishes a thinned margin from a subject that merely fit inside the original inset
Diagnostics
  • Instance-candidate-trace
  • Instance-settled-margin-record
  • Instance-visibility-area-trace
Row.id applies its bounded change after the base settles

activity-offset-follows-settled-base

scenarioper camera-activities row

Applies when row activity kind is Look ahead or Aim or peek offset or Shake or Scripted move.

Activity Row.id applies after the base settles and is bounded by the strongest change cited at Row.extent declared in. A position-changing activity is an offset outside the set this follow mode supplies and can pass any travel limit the camera declares; the final test still decides every promise. The test names the address and restates nothing from it.

Given

active activity Row.id at its strongest displacement cited at Row.extent declared in

When
  • the candidate is built after the base position and travel clamp settle
Then
  • the activity change is bounded by Row.extent declared in and is applied after the base settles
  • a position-changing activity is an activity offset outside the set this follow mode supplies and can carry the candidate past any travel limit the camera declares
  • the offset never substitutes for the final composed-view test
Diagnostics
  • Instance-activity-log
  • Instance-candidate-trace
  • Instance-displayed-frame-log
Row.id proposes and settles one temporary view size

temporary-zoom-settles-one-proposed-size

scenarioper camera-activities row

Applies when row activity kind is Temporary zoom.

During the interval cited at Row.applies when, temporary-zoom activity Row.id proposes the size cited at Row.extent declared in. The controller disposes of it with the row's promise effect and every unsuspended promise, and exactly one view size settles per displayed moment. While the proposal is accepted, the temporary size replaces whatever this camera's view-size answer would otherwise settle: the authored size, the held level, or the fit result. When the activity ends, that size returns on the next displayed moment.

Given

active temporary-zoom activity Row.id on Row.camera id during the interval cited at Row.applies when

When
  • the activity proposes the size cited at Row.extent declared in as a temporary view size
Then
  • the controller disposes of the proposal under this row's promise effect and every unsuspended promise together
  • exactly one view size settles per displayed moment
  • while the proposal is accepted, the temporary size replaces the size this camera's view-size answer would otherwise settle: the authored size, the held level, or the fit result
  • on the first displayed moment after the activity ends, the authored size, held level, or fit result settles again
Diagnostics
  • Instance-activity-log
  • Instance-view-size-trace
  • Instance-controller-disposal-log
Row.id receives proposals through its cited aim actions

aim-offset-uses-cited-actions

scenarioper camera-activities row

Applies when row activity kind is Aim or peek offset.

Aim-or-peek activity Row.id receives proposals only through the game actions cited at Row.actions declared in. The controller still disposes of the displayed result. The test names the address and restates nothing from it.

Given

activity Row.id and supported and unsupported game actions

When
  • aim or peek proposals are collected
Then
  • only the game actions cited at Row.actions declared in produce this activity's proposal
  • the controller still disposes of the displayed result
Diagnostics
  • Instance-player-proposal-log
  • Instance-controller-disposal-log
Row.id uses its authored view size

fixed-size-uses-authored-size

scenarioper cameras row

Applies when row view size is Fixed size.

Fixed-size camera Row.id uses the authored size named at Row.view declared in. Only an active temporary-zoom activity can propose another temporary size. The test names the address and restates nothing from it.

Given

active fixed-size camera Row.id across ordinary activity and, where this adoption has such an activity, every active temporary-zoom activity it can construct

When
  • view size settles
Then
  • without an active temporary-zoom activity the size is exactly the authored size named at Row.view declared in
  • only an active temporary-zoom activity can propose a different temporary size
Diagnostics
  • Instance-view-size-trace
  • Instance-activity-log
Row.id starts from held zoom inside its cited range

player-held-zoom-starts-in-cited-range

scenarioper cameras row

Applies when row view size is Player held zoom.

Player-held-zoom camera Row.id starts from the held level inside the range cited at Row.view size rule declared in. Where this camera declares a player-zoom activity row, that row's promise effect decides keep or suspend; where it declares none, the controller must keep every applicable promise at every held level. Only the game actions cited at the same address change the held level. The controller disposes of the final size with all unsuspended promises. The test names the address and restates nothing from it.

Given

active player-held-zoom camera Row.id, held levels at the ends and interior of the range cited at Row.view size rule declared in, and each player-zoom activity row this camera declares, or the no-row default where it declares none

When
  • view size settles with each applicable player-zoom activity row
Then
  • the proposal starts from the player's held level inside the cited range
  • where this camera declares a player-zoom activity row, that row's promise effect decides keep or suspend; where it declares none, the controller must keep every applicable promise at every held level
  • only the game actions cited at Row.view size rule declared in change the held level
  • the controller disposes of the final size together with every unsuspended promise
Diagnostics
  • Instance-view-size-trace
  • Instance-suspension-log
  • Instance-controller-disposal-log
Row.id chooses the largest allowed fitting size

automatic-fit-chooses-largest-valid-size

scenarioper cameras row

Applies when row view size is Automatic fit.

Automatic-fit camera Row.id follows Row.view size rule declared in and chooses the largest allowed size where the subject extent, margins, the strongest cited displacement of every position-changing keeps-promise activity on this camera, and the largest cited size of every size-changing one fit together. If nothing fits, failure settlement begins. The test names the address and restates nothing from it.

Given

active automatic-fit camera Row.id, its applicable extents and margins, and every keeps-promise activity row whose camera-id names this camera

When
  • the fit rule cited at Row.view size rule declared in settles view size
Then
  • the controller chooses the largest allowed size where the subject extent, margins, the strongest cited displacement of every position-changing keeps-promise activity on this camera, and the largest cited size of every size-changing one fit together
  • if no allowed size and position fits, failure settlement begins
Diagnostics
  • Instance-view-size-trace
  • Instance-candidate-trace
  • Instance-failure-record
Row.id continues automatic fitting after its centre is clamped

automatic-fit-respects-travel-region

scenarioper cameras row

Applies when row view size is Automatic fit and row travel limit is One world region or Changes by situation.

When automatic fitting would need a centre outside the travel region cited at Row.travel limit declared in, camera Row.id clamps the centre and continues fitting inside the range cited at Row.view size rule declared in, even when the visible region extends beyond the travel region. If no allowed size and clamped position fits, failure settlement begins. The test names the addresses and restates nothing from them.

Given

active automatic-fit camera Row.id at positions where fitting would need a centre outside the region cited at Row.travel limit declared in

When
  • the fit rule cited at Row.view size rule declared in and the travel limit settle together
Then
  • the controller clamps the centre to the travel region and continues fitting inside the cited size range even when the visible region extends beyond the travel region
  • if no allowed size and clamped position fits, failure settlement begins
Diagnostics
  • Instance-view-size-trace
  • Instance-candidate-trace
  • Instance-failure-record
the final composed-view test decides every promise

final-composed-test-decides-frame

scenarioonce

Applies when Content visibility is Declared content.

After the final view and HUD are composed, every applicable unsuspended promise is tested against its inset visibility area. That result alone decides validity; no follow trigger, recenter action, travel limit, or earlier candidate substitutes for it. When every applicable unsuspended promise passes, that composed view is the displayed play moment. Exactly one view size settles per displayed play moment on each active camera, and the controller disposes of every size and position proposal under the activity permission and all unsuspended promises together.

Given

each candidate Instance can construct, including candidates that pass an earlier follow, recenter, travel, or position check

When
  • the final view and HUD are composed
Then
  • every applicable unsuspended promise is tested against its inset visibility area
  • only this final test decides whether the frame is valid
  • no follow trigger, recenter action, travel limit, or earlier candidate substitutes for the final test
  • when every applicable unsuspended promise passes, that composed view is the displayed play moment
  • exactly one view size settles for each displayed play moment on each active camera
  • the controller disposes of every size and position proposal under the activity permission and all unsuspended promises together
Diagnostics
  • Instance-candidate-trace
  • Instance-visibility-area-trace
  • Instance-displayed-frame-log
Row.id keeps every affected promise for its full interval

keeps-promise-holds-through-full-interval

generalper camera-activities row

Applies when row promise effect is Keeps promise and row activity kind is Look ahead or Aim or peek offset or Shake or Temporary zoom or Scripted move.

Activity Row.id is demonstrated as keeps-promise only when the final test passes for every affected unsuspended promise on every displayed play moment in its interval at Row.applies when, including the strongest displacement or size change cited at Row.extent declared in. The test names the addresses and restates nothing from them.

Holds

the final composed-view test passes for every affected unsuspended promise on every displayed play moment in the interval cited at Row.applies when, including the strongest displacement or size change cited at Row.extent declared in

Seeds

Inputs seeds

Scope

Inputs scope

Diagnostics
  • Instance-activity-log
  • Instance-displayed-frame-log
  • Instance-visibility-area-trace
Row.id keeps every affected promise across its proposals

keeps-promise-holds-for-pan-and-zoom

generalper camera-activities row

Applies when row promise effect is Keeps promise and row activity kind is Manual pan or Player zoom.

Activity Row.id is demonstrated as keeps-promise only when the final test passes for every affected unsuspended promise on every displayed play moment in its interval at Row.applies when, including Bind activity bound. The test names the address and restates nothing from it.

Holds

the final composed-view test passes for every affected unsuspended promise on every displayed play moment in the interval cited at Row.applies when, including Bind activity bound

Seeds

Inputs seeds

Scope

Inputs scope

Diagnostics
  • Instance-activity-log
  • Instance-displayed-frame-log
  • Instance-visibility-area-trace
Row.id creates one complete failure record after search

failure-record-follows-exhausted-search

scenarioper cameras row

Applies when Content visibility is Declared content.

For camera Row.id, one complete framing failure is created only after no allowed candidate passes. It records the camera, failed promises, display size, visibility areas, settled margins, attempted position and size, travel limit, active activities, and selected response. Before that point, the response weakens no coverage row. If this adoption can construct no exhausted search, the failure branch asserts nothing.

Given

active camera Row.id and each situation the adoption can construct where every allowed candidate fails; where no such situation is reachable, the failure branch asserts nothing

When
  • the allowed position and view-size search is exhausted
Then
  • exactly one framing failure is created only after no allowed candidate passes
  • the record contains the camera id, failed promise ids, display size, visibility areas, settled margins, attempted position and view size, travel limit, active activities, and selected failure response
  • before this step, the failure response weakens no coverage row
Diagnostics
  • Instance-candidate-trace
  • Instance-failure-record
  • Instance-visibility-area-trace
Row.id holds a valid frame on failure

hold-valid-frame-keeps-invalid-candidate-offscreen

scenarioper cameras row

Applies when Content visibility is Declared content and row failure response is Hold valid frame.

On a reached failure, Row.id never displays the invalid candidate. It keeps the last valid frame or, before one exists, the non-play transition surface cited at Row.failure handling declared in. That cited rule decides whether play or a transition advances. The test names the address and restates nothing from it.

Given

each reached framing failure for Row.id, both where a valid frame has already been displayed and where none has yet been displayed

When
  • the hold-valid-frame response cited at Row.failure handling declared in settles
Then
  • the invalid candidate is never displayed
  • after a prior valid frame, that last valid frame remains displayed; before one exists, the cited non-play transition surface is displayed
  • the rule at Row.failure handling declared in decides whether play or a transition advances
Diagnostics
  • Instance-failure-record
  • Instance-displayed-frame-log
  • Instance-transition-log
Row.id applies its total priority on failure

keep-priority-content-displays-best-allowed-frame

scenarioper cameras row

Applies when Content visibility is Declared content and row failure response is Keep priority content.

On a reached failure, Row.id applies the total priority cited at Row.failure handling declared in, displays the best allowed frame, and records every promise that did not fit. The test names the address and restates nothing from it.

Given

a reached framing failure for Row.id with candidate frames that preserve different promise subsets

When
  • the response applies the total priority cited at Row.failure handling declared in
Then
  • the best allowed frame under that cited total priority is displayed
  • every promise that does not fit in that displayed frame is recorded as failed
Diagnostics
  • Instance-failure-record
  • Instance-candidate-trace
  • Instance-displayed-frame-log
Row.id shows its cited framing-failure state

show-framing-failure-adds-cited-state

scenarioper cameras row

Applies when Content visibility is Declared content and row failure response is Show framing failure.

On a reached failure, Row.id displays the best allowed frame with the player-facing state cited at Row.failure handling declared in. The test names the address and restates nothing from it.

Given

a reached framing failure for Row.id

When
  • the response at Row.failure handling declared in settles
Then
  • the best allowed frame is displayed
  • the player-facing failure state cited at Row.failure handling declared in is present on that displayed result
Diagnostics
  • Instance-failure-record
  • Instance-displayed-frame-log
  • Instance-player-facing-state-log
Row.id changes the world and reruns framing

change-world-reruns-framing-before-display

scenarioper cameras row

Applies when Content visibility is Declared content and row failure response is Change world to restore frame.

On a reached failure, Row.id applies the tether, defeat, or move rule cited at Row.failure handling declared in, then reruns promise selection through the final composed-view test before another displayed play moment. The rule changes neither the active camera set nor the play-region set. The test fixes those consequences and restates nothing from the cited rule.

Given

a reached framing failure for Row.id

When
  • the game rule cited at Row.failure handling declared in applies its tether, defeat, or move
Then
  • steps 2 through 10 rerun before another displayed play moment
  • the active camera set is unchanged and no play region is created
  • only the rerun result can produce a valid frame or another framing failure
Diagnostics
  • Instance-failure-record
  • Instance-active-camera-trace
  • Instance-displayed-frame-log
Row.id treats a reached failure as an invalid claim

failure-unreachable-invalidates-reached-claim

scenarioper cameras row

Applies when Content visibility is Declared content and row failure response is Failure unreachable.

Camera Row.id declares no failure handling beyond the failure record itself. A failure record for this camera contradicts the complete unreachability argument cited at Row.failure handling declared in, and the design claim fails. The test names the address and restates nothing from it.

Given

camera Row.id and the complete unreachability argument cited at Row.failure handling declared in

When
  • the run exercises every supported display size and route named by the cited argument
Then
  • no failure handling beyond the failure record itself is declared
  • a failure record for this camera contradicts the argument cited at Row.failure handling declared in and the design claim fails
Diagnostics
  • Instance-candidate-trace
  • Instance-failure-record
  • Instance-first-unreachable-counterexample
a framing failure persists until settlement or deactivation

failure-persists-until-valid-or-inactive

scenarioonce

Applies when Content visibility is Declared content.

Every reached framing failure persists until a later valid settlement or camera deactivation. Priority, a notice, or a started world change does not itself make an invalid frame satisfy a promise. If this adoption cannot reach failure, the template asserts nothing.

Given

each framing failure Instance can reach; if none is reachable, this test asserts nothing

When
  • priority is applied, a notice is shown, a world change starts, and later settlement or deactivation occurs as available
Then
  • the failure remains a failure until a later settlement produces a valid frame or the camera deactivates
  • priority, a visible notice, or a started world change does not by itself turn an invalid frame into a kept promise
Diagnostics
  • Instance-failure-record
  • Instance-displayed-frame-log
  • Instance-active-camera-trace
recovery and handover insert no unchecked frame

recovery-and-handover-insert-no-unchecked-frame

scenarioonce

Applies for every adoption

Neither the end of a suspension nor a camera switch inserts an unchecked frame, and neither leaves two cameras active in one play region. An adoption in which no camera activation follows a deactivation has no handover case to construct.

Given

each suspension end and camera handover Instance can construct; an adoption in which no camera activation follows a deactivation has no handover case to construct

When
  • the next displayed play moment is prepared
Then
  • neither recovery nor switching inserts an unchecked frame or leaves two cameras active in one play region
Diagnostics
  • Instance-active-camera-trace
  • Instance-displayed-frame-log
recovery and handover settle a checked first frame

recovery-and-handover-first-frame-is-settled

scenarioonce

Applies when Content visibility is Declared content.

After a suspension ends, the mechanism reruns promise selection through the final composed-view test before the next displayed play moment; that moment is valid or enters failure settlement. A handover runs active-region selection through the final composed-view test with the incoming camera's own promises and visibility areas. An adoption in which no camera activation follows a deactivation has no handover case to construct.

Given

each suspension end and camera handover Instance can construct; an adoption in which no camera activation follows a deactivation has no handover case to construct

When
  • the next displayed play moment is prepared
Then
  • after a suspension ends, steps 2 through 10 run and the first unsuspended moment is valid or enters steps 11 through 13
  • at handover, steps 1 through 10 run with the incoming camera's own promise set and visibility areas
Diagnostics
  • Instance-suspension-log
  • Instance-active-camera-trace
  • Instance-displayed-frame-log
  • Instance-failure-record
Row.id checks its first frame after every activation

camera-first-frame-is-checked

scenarioper cameras row

Applies when Content visibility is Declared content.

Whenever camera Row.id becomes active, whether at a handover or a reactivation, its first displayed play moment in the region cited at Row.view declared in is tested against this camera's own applicable promises and visibility areas. It is valid or enters failure settlement under the failure response this camera declares.

Given

each activation of camera Row.id, whether at a handover or a reactivation

When
  • its first displayed play moment is prepared in the region cited at Row.view declared in
Then
  • the first displayed play moment is tested against this camera's own applicable promises and visibility areas
  • that moment is valid or enters failure settlement under this camera's own Row.failure response answer
Diagnostics
  • Instance-active-camera-trace
  • Instance-visibility-area-trace
  • Instance-displayed-frame-log
  • Instance-failure-record
declaration check: Row.id names exactly one camera in this adoption

promise-camera-id-joins-one-camera

scenarioper coverage-promises row

Applies for every adoption

Declaration check: coverage promise Row.id is legal only when Row.camera id names exactly one cameras row in this adoption. A missing or ambiguous name is a defect this test fails by construction. This check reads the adoption, not the running game; the validator cannot check this join, so the reviewer does.

Given

coverage-promises row Row.id with camera-id Row.camera id

When
  • the cameras rows are inspected
Then
  • Row.camera id names exactly one cameras row in this adoption; a missing or ambiguous join is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
declaration check: Row.id names exactly one camera in this adoption

activity-camera-id-joins-one-camera

scenarioper camera-activities row

Applies for every adoption

Declaration check: camera activity Row.id is legal only when Row.camera id names exactly one cameras row in this adoption. A missing or ambiguous name is a defect this test fails by construction. This check reads the adoption, not the running game; the validator cannot check this join, so the reviewer does.

Given

camera-activities row Row.id with camera-id Row.camera id

When
  • the cameras rows are inspected
Then
  • Row.camera id names exactly one cameras row in this adoption; a missing or ambiguous join is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
declaration check: Row.id cites promises only from its own camera

activity-promise-list-stays-on-camera

scenarioper camera-activities row

Applies for every adoption

Declaration check: where activity Row.id cites a promises list, every named promise must exist and belong to Row.camera id. A stale, missing, or foreign-camera name is a defect this test fails by construction. Where the row cites no list, this join test asserts nothing. This check reads the adoption, not the running game. The test names no list contents and restates nothing from its citation.

Given

camera-activities row Row.id and the fixed promise list this row cites in its promises field, when it has one; where it cites none, the list clause asserts nothing

When
  • the named coverage-promises rows and their camera-id fields are inspected
Then
  • every named promise exists and has camera-id Row.camera id; a missing promise or a promise on another camera is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
declaration check: the adoption declares at least one camera

adoption-declares-a-camera

scenarioonce

Applies for every adoption

Declaration check: a camera-framing adoption declares at least one cameras row. An adoption with none describes no play view and is a defect this test fails by construction. This check reads the adoption, not the running game.

Given

the cameras row set for Instance

When
  • the adoption is reviewed as a camera-framing adoption
Then
  • at least one cameras row exists; an adoption with none describes no play view and is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
declaration check: declared content includes at least one coverage promise

declared-content-has-a-promise

scenarioonce

Applies when Content visibility is Declared content.

Declaration check: an adoption answering declared-content declares at least one coverage-promises row. If it declares none, it has no visibility promise to test and fails this test by construction. This check reads the adoption, not the running game.

Given

Instance answering declared-content

When
  • its coverage-promises rows are inspected
Then
  • at least one coverage-promises row exists; an adoption that answers declared-content and declares none has no promise to test and is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
declaration check: a free promise-bearing camera declares manual-pan activity

free-promise-camera-has-manual-pan-activity

scenarioper cameras row

Applies when row follow mode is Free view or Free with recenter.

Declaration check: where free camera Row.id carries a coverage promise, it declares at least one manual-pan activity row naming this camera. A missing row is a defect this test fails by construction. A free camera with no promise asserts nothing here. This check reads the adoption, not the running game.

Given

camera Row.id where at least one coverage promise names it; where no promise names it, this test asserts nothing

When
  • the camera-activities rows are inspected
Then
  • the promise-bearing free camera has at least one manual-pan activity row whose camera-id names Row.id; a missing row is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
declaration check: no-content-guarantee declares no promise machinery

no-content-guarantee-keeps-promise-shape-empty

scenarioonce

Applies when Content visibility is No content guarantee.

Declaration check: an adoption answering no-content-guarantee declares both coverage-promises and camera-activities empty. A non-empty row set is a defect this test fails by construction. This check reads the adoption, not the running game.

Given

Instance answering no-content-guarantee

When
  • its promise and activity declarations are inspected
Then
  • the coverage-promises and camera-activities row sets are both empty; a non-empty set is a defect this test fails by construction
Diagnostics
  • Instance-declaration-record
the framing authority order holds for the whole run

framing-holds

generalonce

Applies for every adoption

Across Inputs scope, every displayed play moment follows the mechanism's authority order. Later stages never rewrite an earlier declaration, no question answer or row field changes the settlement order, and no displayed moment is both invalid and outside failure settlement. An adoption answering no-content-guarantee audits only the active-region and displayed-moment stages. The adoption supplies the audit seeds through verification inputs.

Holds

every displayed play moment passes in order through active play region, applicable promise, each coverage row's visibility area and margin, activity suspension, player proposal and controller disposal, camera-position travel limit, allowed position and view-size settlement, final composed-view test, and failure response; later stages never rewrite an earlier declaration; no question answer or row field changes the order in which these stages settle; no displayed play moment is both invalid and outside steps 11 through 13; an adoption answering no-content-guarantee audits only the active-region and displayed-moment stages

Seeds

Inputs seeds

Scope

Inputs scope

Diagnostics
  • Instance-displayed-frame-log
  • Instance-active-camera-trace
  • Instance-candidate-trace
  • Instance-suspension-log
  • Instance-failure-record
  • Instance-first-authority-order-violation

Use this contract in your game ↑