Skip to content
Merged
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
8 changes: 8 additions & 0 deletions docs/review/device-qa/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).
9 changes: 9 additions & 0 deletions docs/review/device-qa/camera-assert-2026-11-06.md
Original file line number Diff line number Diff line change
@@ -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.
13 changes: 13 additions & 0 deletions docs/review/device-qa/court-luma-2026-11-06.md
Original file line number Diff line number Diff line change
@@ -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.
9 changes: 9 additions & 0 deletions docs/review/device-qa/fog-clock-2026-11-06.md
Original file line number Diff line number Diff line change
@@ -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.
9 changes: 9 additions & 0 deletions docs/review/device-qa/fog-unbacked-2026-11-06.md
Original file line number Diff line number Diff line change
@@ -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.
9 changes: 9 additions & 0 deletions docs/review/device-qa/medal-directory-2026-11-06.md
Original file line number Diff line number Diff line change
@@ -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.
9 changes: 9 additions & 0 deletions docs/review/device-qa/patrol-spawn-2026-11-06.md
Original file line number Diff line number Diff line change
@@ -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.
11 changes: 11 additions & 0 deletions docs/review/device-qa/socket-lists-2026-11-06.md
Original file line number Diff line number Diff line change
@@ -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.
11 changes: 11 additions & 0 deletions docs/review/device-qa/spawn-mounts-2026-11-06.md
Original file line number Diff line number Diff line change
@@ -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.
Loading