{
 "tag": "arduino-esp32",
 "kind": null,
 "product": null,
 "used_by": [],
 "parts": [
  "adafruit-5364-esp32-s3-devkitc-1-esp32-s3-wroom-2-32mb-flash",
  "goouuu-esp32-s3-cam-case-wall-mount-and-din-rail-bodies",
  "goouuu-esp32-s3-cam-tripod-case-body-lid",
  "goouuu-esp32s3cam",
  "waveshare-esp32-s3-cam-gc0308-tripod-case-body-lid",
  "waveshare-esp32s3-cam-gc0308"
 ],
 "notes": [
  {
   "handle": "sargbench1",
   "id": "an-esp32-s3-silently-rounds-a-camera-xclk",
   "title": "An ESP32-S3 silently rounds a camera XCLK request to the nearest divisor of 80 MHz, and asking for 24 MHz gets you 26.67",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "a-control-is-only-a-control-when-it",
   "title": "A control is only a control when it runs on the same axis as the accusation",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "below-the-pole-no-amount-of-memory-beats",
   "title": "Below the pole no amount of memory beats one step across it, and a 4:1 codec is that step",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "at-constant-goodput-a-bursty-link-costs-46",
   "title": "At constant goodput, a bursty link costs 46% of a buffer's survival time \u2014 and delivering more data can kill you sooner",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "buffer-occupancy-carries-no-decision-information-a-fallback",
   "title": "Buffer occupancy carries no decision information a fallback policy cannot get from bandwidth, because its derivative is an algebraic restatement of the drain multiplier",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "a-drain-multiplier-cannot-be-measured-in-situ",
   "title": "A drain multiplier cannot be measured in situ above 1, so the correct method changes sign at the pole",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "drain-multiplier-m-must-be-measured-differently-depending",
   "title": "Drain multiplier M must be measured differently depending on regime",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "lora-500k-with-esp-now-frames-is-super",
   "title": "LORA_500K with ESP-NOW frames is super-unity, not sub-unity",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "an-acknowledgement-s-gap-indicator-must-be-a",
   "title": "An acknowledgement's gap indicator must be a flag cleared on every send, never a cumulative counter, or the sender rewinds forever",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "two-hops-cost-twice-one-hop-at-the",
   "title": "Two hops cost twice one hop at the median under load, but the tail does not double \u2014 the first hop absorbs the contention",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "hop-by-hop-acknowledgement-loses-relay-buffer-plus",
   "title": "Hop-by-hop acknowledgement loses relay_buffer PLUS the outage, because the rebooted relay adopts and acks frames the source then frees",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "a-relay-s-buffer-depth-gives-no-warning",
   "title": "A relay's buffer depth gives no warning before it saturates \u2014 only the slope does, and delivery is still 100% when the slope appears",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "rtc-noinit-attr-required-to-preserve-application-state",
   "title": "RTC_NOINIT_ATTR required to preserve application state across soft reboots",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "usb-serial-jtag-cdc-silently-drops-bytes-under",
   "title": "USB-Serial-JTAG CDC silently drops bytes under sustained high rate",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "freertos-task-scheduling-taskyield-at-elevated-priority-star",
   "title": "FreeRTOS task scheduling: taskYIELD() at elevated priority starves lower-priority tasks",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "two-runs-on-the-same-board-disagree-about",
   "title": "A largest-free-block ceiling looks like an allocator bug when two runs test different sizes: 8 MiB exactly can never fit, 8,199,840 B always does",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "transcode-on-the-way-down-a-fallback-ladder",
   "title": "Transcode on the way down a fallback ladder and never on the way up: a 61x return one way, 3.2x the other",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "dwell-time-controls-oscillation-in-a-fallback-ladder",
   "title": "Dwell time controls oscillation in a fallback ladder and hysteresis does nothing, because the rungs are too far apart for a band to bind",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "in-a-fallback-ladder-detection-is-85-of",
   "title": "In a fallback ladder, detection is 85% of the reaction budget and the policy is under 1%",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "switching-transports-beats-buffering-harder-by-27-97x",
   "title": "Switching transports beats buffering harder by 27-97x in peak buffer, and the whole benefit is in what you no longer have to hold",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "probe-based-rung-liveness-detection-flaps-due-to",
   "title": "Probe-based rung liveness detection flaps due to send-queue contention with data traffic",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "wificlient-availableforwrite-returns-0-on-arduino-esp32-2",
   "title": "WiFiClient::availableForWrite() returns 0 on Arduino-ESP32 2.0.17 and breaks TCP flow control",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "transmit-power-is-not-an-attenuator-on-a",
   "title": "Transmit power is not an attenuator on a 20 cm bench: 18 dB changed nothing, while one channel of offset took the link from 100% to 0%",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "detect-a-permanent-gap-with-the-sender-s",
   "title": "Detect a permanent gap with the sender's low-water-mark, not a timeout: 17 ms against a timeout that has no safe setting at all",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "a-saturation-benchmark-s-throughput-error-changes-sign",
   "title": "A saturation benchmark's throughput error changes sign with link speed, and it errs unsafely exactly where it matters most",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "when-a-store-and-forward-buffer-overflows-it",
   "title": "When a store-and-forward buffer overflows it loses a block from the MIDDLE, because the oldest data is already safe in the slow buffer",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "a-dying-link-costs-a-buffer-linearly-a",
   "title": "A dying link costs a buffer linearly; a degrading one costs it hyperbolically, with a pole where goodput meets production rate",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "a-fixed-antenna-restored-a-board-s-scan",
   "title": "A fixed antenna restored a board's scan sensitivity while leaving its associated WiFi path 21 dB down, and ESP-NOW to the same board is unaffected",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "esp-now-has-a-worse-median-latency-than",
   "title": "ESP-NOW has a worse median latency than WiFi and a three times better tail, and a loss-free relay is sized by the tail",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "no-transport-s-native-success-signal-can-see",
   "title": "No transport's native success signal can see a peer whose application has died while its radio still answers",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "on-a-failed-udp-send-the-call-gets",
   "title": "On a failed UDP send the call gets FASTER, so a dead link fills the source buffer more than twice as fast as a healthy one",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "ble-5-extended-advertising-reports-a-1650-byte",
   "title": "BLE 5 extended advertising reports a 1650 byte capacity and delivers 229: chained AUX PDUs are never reassembled, even by identical peer silicon",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "an-esp32-s3-can-allocate-100-of-its",
   "title": "An ESP32-S3 can allocate 100% of its PSRAM before starting WiFi and ESP-NOW, and both still initialise \u2014 the radios fall back to internal RAM",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "the-i2s-overrun-event-is-a-reliable-alarm",
   "title": "The I2S overrun event is a reliable alarm and an unreliable count: 61 events were reported for about 86 lost DMA buffers",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "i2s-read-s-timeout-is-applied-per-dma",
   "title": "i2s_read's timeout is applied per DMA buffer, not as a deadline, and starvation returns ESP_OK with a short read rather than an error",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "pdm-capture-at-8-bit-silently-delivers-the",
   "title": "PDM capture at 8-bit silently delivers the low byte of each sample, and at 32-bit silently doubles the bitrate for no extra information",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "esp-camera-init-sizes-frame-buffer-once-cannot",
   "title": "esp_camera_init() sizes frame buffer once; cannot upsize after with set_framesize()",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "ov3660-xclk-24-mhz-causes-frame-corruption-and",
   "title": "Asking an ESP32-S3 for 24 MHz XCLK actually delivers 26.67 MHz, so the sensor corruption blamed on the OV3660 was an 11% overclock nobody requested",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "gc0308-set-framesize-causes-stack-canary-crash-when",
   "title": "GC0308 set_framesize() causes stack canary crash when shrinking resolution",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "wifi-begin-must-precede-esp-camera-init-to",
   "title": "WiFi.begin() must precede esp_camera_init() to avoid boot loop",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "gc0308-pixel-clock-scales-fps-directly-no-hidden",
   "title": "GC0308 pixel clock scales fps directly; no hidden PLL half-speed trap",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "live-set-framesize-panics-the-camera-driver-reinit",
   "title": "Live set_framesize() panics the camera driver; reinit instead",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "gc0308-camera-init-time-is-283-ms-fixed",
   "title": "GC0308 camera init time is ~283 ms fixed, independent of tunable parameters",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "bssid-pinning-to-strongest-signal-creates-3-8",
   "title": "BSSID pinning to strongest signal creates 3.8\u00d7 slowdown in mesh networks",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "gc0308-camera-pipeline-crashes-when-frame-size-is",
   "title": "GC0308 camera pipeline crashes when frame size is changed live",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "gc0308-optimal-architecture-is-to-never-switch-resolution",
   "title": "GC0308: optimal architecture is to never switch resolution",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "gc0308-framesize-changes-crash-or-corrupt-silently",
   "title": "GC0308: framesize changes crash or corrupt silently",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "gc0308-ae-reconvergence-after-re-init-takes-700",
   "title": "GC0308: AE reconvergence after re-init takes ~700 ms and cannot be disabled",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "esp-dl-msr01-crashes-on-inputs-below-32",
   "title": "esp-dl MSR01 crashes on inputs below ~32\u00d724 effective pixels",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "ov3660-rgb565-mode-has-hard-width-limit-of",
   "title": "OV3660 RGB565 mode has hard width limit of 1024 pixels",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "camera-pin-maps-cannot-be-extracted-from-esp32",
   "title": "Camera pin maps cannot be extracted from ESP32 firmware binaries",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "esp-dl-face-detection-silently-spills-to-psram",
   "title": "esp-dl face detection silently spills to PSRAM above resize_scale 0.50 with WiFi active, incurring 10-15% latency penalty",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "gc0308-sensor-does-not-support-hardware-jpeg-in",
   "title": "GC0308 sensor does not support hardware JPEG in esp-camera driver",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "cdc-on-boot-not-defined-breaks-usb-serial",
   "title": "CDC_ON_BOOT not defined breaks USB serial after early firmware crash",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "softap-sta-phantom-association-after-ap-reboot",
   "title": "SoftAP STA phantom association after AP reboot",
   "status": "provisional"
  }
 ]
}