diff --git a/docs/review/device-qa/README.md b/docs/review/device-qa/README.md index 67f3086..2634eb9 100644 --- a/docs/review/device-qa/README.md +++ b/docs/review/device-qa/README.md @@ -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). diff --git a/docs/review/device-qa/camera-overlay-2026-11-05.md b/docs/review/device-qa/camera-overlay-2026-11-05.md new file mode 100644 index 0000000..914951a --- /dev/null +++ b/docs/review/device-qa/camera-overlay-2026-11-05.md @@ -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. diff --git a/docs/review/device-qa/captain-field-2026-11-05.md b/docs/review/device-qa/captain-field-2026-11-05.md new file mode 100644 index 0000000..079cfc2 --- /dev/null +++ b/docs/review/device-qa/captain-field-2026-11-05.md @@ -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. diff --git a/docs/review/device-qa/closest-point-2026-11-05.md b/docs/review/device-qa/closest-point-2026-11-05.md new file mode 100644 index 0000000..89d9b4e --- /dev/null +++ b/docs/review/device-qa/closest-point-2026-11-05.md @@ -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. diff --git a/docs/review/device-qa/daemon-expiry-2026-11-05.md b/docs/review/device-qa/daemon-expiry-2026-11-05.md new file mode 100644 index 0000000..ca7ce27 --- /dev/null +++ b/docs/review/device-qa/daemon-expiry-2026-11-05.md @@ -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. diff --git a/docs/review/device-qa/defeat-count-2026-11-05.md b/docs/review/device-qa/defeat-count-2026-11-05.md new file mode 100644 index 0000000..c9c6910 --- /dev/null +++ b/docs/review/device-qa/defeat-count-2026-11-05.md @@ -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. diff --git a/docs/review/device-qa/diagnostic-seal-2026-11-05.md b/docs/review/device-qa/diagnostic-seal-2026-11-05.md new file mode 100644 index 0000000..95d570f --- /dev/null +++ b/docs/review/device-qa/diagnostic-seal-2026-11-05.md @@ -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. diff --git a/docs/review/device-qa/display-delta-2026-11-05.md b/docs/review/device-qa/display-delta-2026-11-05.md new file mode 100644 index 0000000..c426741 --- /dev/null +++ b/docs/review/device-qa/display-delta-2026-11-05.md @@ -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. diff --git a/docs/review/device-qa/outline-weight-2026-11-05.md b/docs/review/device-qa/outline-weight-2026-11-05.md new file mode 100644 index 0000000..040fb49 --- /dev/null +++ b/docs/review/device-qa/outline-weight-2026-11-05.md @@ -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. diff --git a/docs/review/device-qa/pool-rejects-2026-11-05.md b/docs/review/device-qa/pool-rejects-2026-11-05.md new file mode 100644 index 0000000..f441b5b --- /dev/null +++ b/docs/review/device-qa/pool-rejects-2026-11-05.md @@ -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. diff --git a/docs/review/device-qa/view-clamp-2026-11-05.md b/docs/review/device-qa/view-clamp-2026-11-05.md new file mode 100644 index 0000000..ef8d0a5 --- /dev/null +++ b/docs/review/device-qa/view-clamp-2026-11-05.md @@ -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.