diff --git a/docs/review/device-qa/README.md b/docs/review/device-qa/README.md index 2634eb9..253eadf 100644 --- a/docs/review/device-qa/README.md +++ b/docs/review/device-qa/README.md @@ -356,5 +356,13 @@ Each note records one fact about bytes or draw calls already on main. None of th | [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 | +| [court-luma-2026-11-06.md](court-luma-2026-11-06.md) | The court luma, and the exact lerp ends | +| [fog-clock-2026-11-06.md](fog-clock-2026-11-06.md) | The fog clock, on the first sample | +| [fog-unbacked-2026-11-06.md](fog-unbacked-2026-11-06.md) | Fog steps, then draws nothing | +| [camera-assert-2026-11-06.md](camera-assert-2026-11-06.md) | The camera array, already sorted | +| [spawn-mounts-2026-11-06.md](spawn-mounts-2026-11-06.md) | The spawn mounts, in the flood | +| [socket-lists-2026-11-06.md](socket-lists-2026-11-06.md) | The socket lists, not a rejection | +| [medal-directory-2026-11-06.md](medal-directory-2026-11-06.md) | The medal directory, DailyMedals | +| [patrol-spawn-2026-11-06.md](patrol-spawn-2026-11-06.md) | The patrol spawn, without fairness | 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-assert-2026-11-06.md b/docs/review/device-qa/camera-assert-2026-11-06.md new file mode 100644 index 0000000..78db843 --- /dev/null +++ b/docs/review/device-qa/camera-assert-2026-11-06.md @@ -0,0 +1,9 @@ +# The camera array, already sorted + +Read 2026-11-06 from `CameraPlacement.selectedSetPassesRuntimeAsserts` on `ef68565`. No camera was added. + +The count of 8, the four families, the four return-visible sockets, the zone quotas, and the sort inside `materialize` stay in [camera-legal-set-2026-11-04.md](camera-legal-set-2026-11-04.md) and [placed-cameras-2026-11-04.md](placed-cameras-2026-11-04.md). The pool check stays in [pool-rejects-2026-11-05.md](pool-rejects-2026-11-05.md). The UTF-8 comparator stays in [utf8-order-2026-11-05.md](utf8-order-2026-11-05.md). What makes two sockets incompatible stays in the legal-set note. + +The assert returns false unless the socket ids are eight distinct ids and the array's order already equals those ids sorted by UTF-8 bytes. It does not sort a set that passes. Along that order, each entity id must be strictly greater than the one before it. An incompatible pair returns false. + +This does not add a camera. diff --git a/docs/review/device-qa/court-luma-2026-11-06.md b/docs/review/device-qa/court-luma-2026-11-06.md new file mode 100644 index 0000000..728fded --- /dev/null +++ b/docs/review/device-qa/court-luma-2026-11-06.md @@ -0,0 +1,13 @@ +# The court luma + +Read 2026-11-06 from `CourtMultiplier`, `CourtPalette.saturation`, `CourtPalette.lerp`, and `CourtLightTracker.update` on `ef68565`. No palette was changed. + +The four RGB triples, the 60-tick crossfade, the 0.60 reduced-flash fraction, and the fade from the light already on screen stay in [court-light-2026-11-04.md](court-light-2026-11-04.md). + +`luma` is `0.2126 * red + 0.7152 * green + 0.0722 * blue`. `maxChannel` is the largest of the three channels. `spread` is that largest minus the smallest. `saturation` sets each channel to `l + (channel − l) * fraction`, where `l` is that luma. `CourtPalette.saturation` does this to the center and to the edge. + +`lerp` clamps `t` to 0…1. It uses `u = 1 − t`, so `t = 0` is `a` and `t = 1` is `b`. Each channel is `a * u + b * t`. `CourtPalette.lerp` does this on the center and on the edge. The neutral multiplier is red 1, green 1, blue 1. + +In the tracker, elapsed is 0 when `tick` is below `changedAt`. Otherwise elapsed is the difference. + +This does not change a palette. diff --git a/docs/review/device-qa/fog-clock-2026-11-06.md b/docs/review/device-qa/fog-clock-2026-11-06.md new file mode 100644 index 0000000..09679ac --- /dev/null +++ b/docs/review/device-qa/fog-clock-2026-11-06.md @@ -0,0 +1,9 @@ +# The fog clock + +Read 2026-11-06 from `FogThinning.update` on `ef68565`. The thinned opacity was not changed. + +The 0.50 multiplier, the 30-tick ease, the smoothstep, and the pause hold stay in [fog-thinning-2026-11-04.md](fog-thinning-2026-11-04.md). + +When `lastTick` is absent, or when `snap.tick` is below `lastTick`, elapsed is 0. Otherwise elapsed is the difference. `lastTick` is then set to `snap.tick`. The view test reads the snapshot's `unaware` flag. The boss and the elite staying aware stays in the fog-thinning note. + +This does not change the thinned opacity. diff --git a/docs/review/device-qa/fog-unbacked-2026-11-06.md b/docs/review/device-qa/fog-unbacked-2026-11-06.md new file mode 100644 index 0000000..552302d --- /dev/null +++ b/docs/review/device-qa/fog-unbacked-2026-11-06.md @@ -0,0 +1,9 @@ +# Fog, unbacked + +Read 2026-11-06 from `WorldRenderer.renderFog` on `ef68565`. No fog tile was added. + +Drift, the split, and the speeds 120 and 300 stay in [fog-drift-2026-11-04.md](fog-drift-2026-11-04.md). `isBacked` stays in [env-groups-2026-11-05.md](env-groups-2026-11-05.md). The thinning clock stays in [fog-clock-2026-11-06.md](fog-clock-2026-11-06.md). + +`fogThinning.update` runs before the guard. When the fog group is not backed, the function returns and draws no tile. The thinning clock has already stepped. + +This does not draw a fog tile. diff --git a/docs/review/device-qa/medal-directory-2026-11-06.md b/docs/review/device-qa/medal-directory-2026-11-06.md new file mode 100644 index 0000000..b9f82dd --- /dev/null +++ b/docs/review/device-qa/medal-directory-2026-11-06.md @@ -0,0 +1,9 @@ +# The medal directory + +Read 2026-11-06 from `MedalStore.directoryURL` on `ef68565`. No medal was changed. + +Load, the atomic write, deleting the other seed files, and an empty earned list writing nothing stay in [medal-record-2026-11-04.md](medal-record-2026-11-04.md). `DailyGhost` stays in [ghost-file-2026-11-04.md](ghost-file-2026-11-04.md). + +The directory is `GhostStore.directoryURL()` with its last path component removed, then `DailyMedals`. The file is `\(seed).json`. + +This does not change a medal. diff --git a/docs/review/device-qa/patrol-spawn-2026-11-06.md b/docs/review/device-qa/patrol-spawn-2026-11-06.md new file mode 100644 index 0000000..f2d9d1a --- /dev/null +++ b/docs/review/device-qa/patrol-spawn-2026-11-06.md @@ -0,0 +1,9 @@ +# The patrol spawn + +Read 2026-11-06 from `Simulation.spawnPatrols` on `ef68565`. No route was added. + +The first waypoint, tick 1, the integrity percent, and the encounter id stay in [patrol-sight-2026-11-04.md](patrol-sight-2026-11-04.md). + +The loop is `arena.patrols` in order. A route with no standard stats is skipped and takes no entity id. The call does not use `SpawnFairness`. Each accepted route takes `allocator.next()`, then `PatrolSystem.member`. + +This does not add a route. diff --git a/docs/review/device-qa/socket-lists-2026-11-06.md b/docs/review/device-qa/socket-lists-2026-11-06.md new file mode 100644 index 0000000..34d2fde --- /dev/null +++ b/docs/review/device-qa/socket-lists-2026-11-06.md @@ -0,0 +1,11 @@ +# The socket lists + +Read 2026-11-06 from `SpawnFairness.socketsBlockedByPermanentSolids` and `socketsOutsideEncounterZone` on `ef68565`. No coordinate was rewritten. + +`authoredSolidOverlaps` stays in [arena-reach-2026-11-05.md](arena-reach-2026-11-05.md). These two lists do not reject a spawn. + +`socketsBlockedByPermanentSolids` lists each enemy spawn socket whose point lies inside a permanent-solid AABB. The label is `socket.id`, or `"x,y"` when the id is nil. The list is sorted by UTF-8 bytes. + +`socketsOutsideEncounterZone` walks each encounter. When content names a zone and the arena has that zone, a socket outside that zone's AABB is labeled the same way. A missing encounter zone is skipped. The list is sorted by UTF-8 bytes. + +This does not reject a spawn. diff --git a/docs/review/device-qa/spawn-mounts-2026-11-06.md b/docs/review/device-qa/spawn-mounts-2026-11-06.md new file mode 100644 index 0000000..e4877a1 --- /dev/null +++ b/docs/review/device-qa/spawn-mounts-2026-11-06.md @@ -0,0 +1,11 @@ +# The spawn mounts + +Read 2026-11-06 from `Simulation.spawnEnemy` and `SpawnFairness.select` on `ef68565`. No socket was moved. + +The fairness predicate stays in [spawn-socket-choice-2026-11-04.md](spawn-socket-choice-2026-11-04.md). The volumes stay in [spawn-lethal-volumes-2026-11-04.md](spawn-lethal-volumes-2026-11-04.md). The collision-time mount list stays in [live-solids-2026-11-05.md](live-solids-2026-11-05.md). `spawnsAware` stays in [heat-awareness-patrol-2026-11-04.md](heat-awareness-patrol-2026-11-04.md). + +Every camera, including a destroyed one, becomes an AABB centered on `camera.position` with half-size `mountCollisionRadius` on both axes. That array is `extraSolids`. `select` passes those solids into `boxes` and into the flood. The closed gate ids are the gates whose `closed` flag is set. + +`select` runs before `allocator.next()`. A miss returns false and takes no entity id. A hit starts in `pursue`, with `stateTicks` 0 and velocity zero. + +This does not move a socket.