Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions docs/review/device-qa/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -346,5 +346,15 @@ Each note records one fact about bytes or draw calls already on main. None of th
| [concealment-flag-2026-11-05.md](concealment-flag-2026-11-05.md) | The concealment flag |
| [body-clearance-2026-11-05.md](body-clearance-2026-11-05.md) | The body clearance |
| [ghost-verify-2026-11-05.md](ghost-verify-2026-11-05.md) | The ghost's second check |
| [camera-overlay-2026-11-05.md](camera-overlay-2026-11-05.md) | The camera event overlay |
| [daemon-expiry-2026-11-05.md](daemon-expiry-2026-11-05.md) | The daemon expiry |
| [pool-rejects-2026-11-05.md](pool-rejects-2026-11-05.md) | The pool rejects |
| [captain-field-2026-11-05.md](captain-field-2026-11-05.md) | The captain field sprite |
| [outline-weight-2026-11-05.md](outline-weight-2026-11-05.md) | The outline weight |
| [display-delta-2026-11-05.md](display-delta-2026-11-05.md) | The display interval |
| [view-clamp-2026-11-05.md](view-clamp-2026-11-05.md) | The view clamp |
| [closest-point-2026-11-05.md](closest-point-2026-11-05.md) | The closest point |
| [defeat-count-2026-11-05.md](defeat-count-2026-11-05.md) | The defeat count |
| [diagnostic-seal-2026-11-05.md](diagnostic-seal-2026-11-05.md) | The diagnostic seal |

Next session: follow [retest-checklist.md](retest-checklist.md) (D-105 allows device checks on any build).
9 changes: 9 additions & 0 deletions docs/review/device-qa/camera-overlay-2026-11-05.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# The camera event overlay

Read 2026-11-05 from `CameraPresentation.project` on `ef68565`. No camera clip was added.

The persistent state and the clip for each state stay in [camera-clip-states-2026-11-04.md](camera-clip-states-2026-11-04.md). The live snapshot uses that persistent state. Playback alignment stays in [clip-interrupt-2026-11-05.md](clip-interrupt-2026-11-05.md).

Hit ids are the `cameraIntegrityChanged` events that carry a primary id. Destroyed ids are the `cameraDestroyed` events that carry one. A camera in the destroyed set is `destroying`. Otherwise integrity at or below 0 is `dormant`. Otherwise a hit id whose integrity is still above 0 is `hit`. Any other camera keeps the persistent state. `fieldVisible` is integrity above 0 and not destroyed in this call. The clip is the clip for the chosen state. `fieldOffClipId` is the field-off clip when the camera was destroyed in this call, and nil otherwise. The heading is copied. `housingTransformLocked` is true. `reducedMotionImmediateSwap` copies the argument, and that argument defaults to false.

This does not change the snapshot's persistent state.
11 changes: 11 additions & 0 deletions docs/review/device-qa/captain-field-2026-11-05.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# The captain field sprite

Read 2026-11-05 from `PresentationSnapshot` on `ef68565`. No field was added.

The fill stays in [world-shapes-2026-11-03.md](world-shapes-2026-11-03.md). The housing art and the three emitter points stay in [captain-housing-bounds-2026-11-03.md](captain-housing-bounds-2026-11-03.md). The wall target that uses `EntityID(0)` stays in [hit-order-2026-11-04.md](hit-order-2026-11-04.md).

While an active emitter exists and `fieldRemaining` is above 0, `captainField` is a camera sprite whose id is `EntityID(0)`. Its position, heading, range, and field angle are that emitter's. Integrity is 1. Detecting is true. The presentation state is `critical`. The field is visible. The clip is the clip for `critical`. The housing family is nil. Otherwise the field is nil.

A housing is active when its id is that live emitter's id. The live id is the active emitter's id only while `fieldRemaining` is above 0. Otherwise the live id is nil, and every housing is inactive.

This does not change the field colour.
9 changes: 9 additions & 0 deletions docs/review/device-qa/closest-point-2026-11-05.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# The closest point

Read 2026-11-05 from `Circle.penetrates` on `ef68565`. No radius was changed.

The slide and the strict compare stay in [circle-slide-2026-11-04.md](circle-slide-2026-11-04.md). The box edges stay in [box-edges-2026-11-05.md](box-edges-2026-11-05.md).

The closest point clamps each raw axis into the box. The axis is the minimum of the maximum of the center and the box minimum, and the box maximum. Those edges are the integer edges times the Q8 scale. A center already inside both ranges uses itself, so both deltas are 0. The radius in the compare is the radius in units times the Q8 scale.

This does not change a solid.
11 changes: 11 additions & 0 deletions docs/review/device-qa/daemon-expiry-2026-11-05.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# The daemon expiry

Read 2026-11-05 from `EnemySystem.stepDaemon` on `ef68565`. No elite timing was changed.

The content cycle stays in [elite-boss-attacks-2026-11-04.md](elite-boss-attacks-2026-11-04.md). The markers, the damage, and the steering while ticks remain stay in [daemon-query-2026-11-04.md](daemon-query-2026-11-04.md).

While `stateTicks` is above 0 the function returns after that steering. On expiry the switch writes the next remaining count as a literal. Those counts match the content cycle. The switch does not read the content fields.

Pursue stores the markers, then sets `queryTelegraph`, remaining 45, and velocity zero. Query telegraph sets `queryResolve`, remaining 0, and calls `stepDaemon` again, so the resolve case runs before the outer call returns. Resolve adds `DaemonQuery.damage`, then sets `dashTelegraph`, remaining 36, and velocity zero. Dash telegraph sets `dash`, remaining 30, and velocity toward the player at `Steering.speedQ8` of 288. That 288 stays in the daemon-query note. Dash sets `recover`, remaining 60, and velocity zero. Any other state sets `pursue`, remaining 120, and steers toward the player at the speed argument.

This does not change the elite cycle.
9 changes: 9 additions & 0 deletions docs/review/device-qa/defeat-count-2026-11-05.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# The defeat count

Read 2026-11-05 from `Simulation.killEnemy` on `ef68565`. No enemy was added.

The elite gate and the boss gate stay in [forward-gates-2026-11-04.md](forward-gates-2026-11-04.md). The receipt field stays in [run-receipt-2026-11-04.md](run-receipt-2026-11-04.md).

The function emits `entityDied` at phase 10. The primary id is the enemy id. The payload carries `entityId` as that id's decimal string and `archetypeId` as the archetype's raw value. It then adds one to `defeatsByArchetype` for that raw value. When the enemy's encounter id is present, that record's `living` becomes the greater of 0 and the previous living minus 1.

This does not change the gate timing.
9 changes: 9 additions & 0 deletions docs/review/device-qa/diagnostic-seal-2026-11-05.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# The diagnostic seal

Read 2026-11-05 from `Simulation.invalidate` on `ef68565`. No outcome was retuned.

The code names and the seal-once rule stay in [terminal-seal-2026-11-04.md](terminal-seal-2026-11-04.md).

The function returns unless the outcome is `playing` or `upgradeSelectionPending`. It then sets the outcome to `invalid`, stores the code, and seals with `state.tick`. The event is `diagnosticFailure` at phase 18. The payload key is `code`, and the value is the code's raw value.

This does not add a diagnostic code.
9 changes: 9 additions & 0 deletions docs/review/device-qa/display-delta-2026-11-05.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# The display interval

Read 2026-11-05 from `GameScene.update` on `ef68565`. No camera gain was changed.

The follow cap, the dead zone, and the look-ahead stay in [camera-follow-2026-11-03.md](camera-follow-2026-11-03.md). Clearing the stored time stays in [pause-2026-11-04.md](pause-2026-11-04.md).

The stored interval starts at 1/60. Each update replaces it before the pause guard. A missing last time uses 1/60. A stored time uses the greater of 0 and the raw difference, and the current time is then kept. When the redraw runs, it passes that interval to `CameraFollow.update`.

This does not change the follow gain.
9 changes: 9 additions & 0 deletions docs/review/device-qa/outline-weight-2026-11-05.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# The outline weight

Read 2026-11-05 from `GameScene.configureHUD` on `ef68565`. No outline weight was retuned.

The property default stays in [faction-outline-2026-11-04.md](faction-outline-2026-11-04.md). `pointsPerSceneUnit` stays in [hud-fit-2026-11-04.md](hud-fit-2026-11-04.md).

After the projector is built, the scene stores `outlineWidthUnits` as 1 divided by `pointsPerSceneUnit`. A size change builds that projector again, so the stored width follows it. A blockout outline's line width is the stored value.

This does not select another sampling scale.
9 changes: 9 additions & 0 deletions docs/review/device-qa/pool-rejects-2026-11-05.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# The pool rejects

Read 2026-11-05 from `CameraPlacement.manifestPoolIsValid` on `ef68565`. No socket was added.

The both-ways ban stays in [camera-legal-set-2026-11-04.md](camera-legal-set-2026-11-04.md). The zone minimums and `requiredByZone` stay in [placed-cameras-2026-11-04.md](placed-cameras-2026-11-04.md).

The check returns false when a socket id is repeated. It returns false when `headingMilliDegrees` is below 0 or above 359_999, when `rangeUnits` is below 1, or when `fieldAngleMilliDegrees` is at or below 0 or above 180_000. An empty housing-family list fails, and so does a list that repeats a family. An enabled socket in Z-01 or Z-07 fails. An enabled socket whose zone is outside the `requiredByZone` zones fails. A socket that lists its own id as incompatible fails. A listed id that is missing from the pool fails.

This does not add a camera.
9 changes: 9 additions & 0 deletions docs/review/device-qa/view-clamp-2026-11-05.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# The view clamp

Read 2026-11-05 from `CameraFollow.update` on `ef68565`. No framing was changed.

The dead zone, the look-ahead, the gain, and the view size stay in [camera-follow-2026-11-03.md](camera-follow-2026-11-03.md).

On each axis the low bound is the arena minimum plus half the view, and the high bound is the arena maximum minus that half. When low is at or below high, the coordinate stays inside that range. When low is above high, the coordinate is the midpoint of the two bounds.

This does not change the view size.
Loading