{
 "digest": null,
 "links": {
  "fits": [
   {
    "product": "goouuu-esp32s3cam",
    "name": "GOOUUU ESP32-S3-CAM (DevKitC-style camera dev board)",
    "kind": ""
   }
  ],
  "members": [],
  "cases": [],
  "assemblies": []
 },
 "prints": [],
 "part": {
  "id": "goouuu-esp32-s3-cam-tripod-case-body-lid",
  "name": "GOOUUU ESP32-S3-CAM tripod case (body + lid)",
  "kind": "case",
  "method": "",
  "vendor": "sargbench2",
  "sku": "",
  "model": "",
  "buy": [],
  "url": "",
  "category": "enclosure",
  "owned_qty": 0
 },
 "facts": {
  "id": "goouuu-esp32s3-cam-case",
  "kind": "made",
  "name": "GOOUUU ESP32-S3-CAM tripod case (body + lid)",
  "aka": [
   "goouuu cam case",
   "esp32-s3-cam 40-pin case"
  ],
  "category": "enclosure",
  "status": "designed",
  "for_parts": [
   "goouuu-esp32s3cam"
  ],
  "frame": "board frame: origin PCB plan bottom-left, +X along the long edge, USB-C on the X=0 end, Z=0 PCB bottom, lens +Z",
  "body": {
   "size_mm": [
    79.0,
    37.0,
    23.5
   ],
   "outline": "rect",
   "corner_r": 3.0,
   "notes": "walls/floor/lid 2.0; cavity x -4.5..70.5, y -2..31 (PCB 63 x 29 + 6.3 antenna overhang); floor Z -10.5, inner floor -8.5, wall top / lid underside Z 11.0, lid top 13.0"
  },
  "mounting": {
   "holes": [
    {
     "xy": [
      33.0,
      -4.0
     ],
     "dia": 8.0,
     "axis": "y",
     "notes": "1/4\"-20 heat-set insert (ruthex RX-1/4-20) in a dia 14 x 12.5 boss on the -Y wall, Z centre 0.25; camera then looks sideways"
    }
   ],
   "pattern": "lid: 4 x M2 x 8 self-tap into full-height corner bosses (pilot 1.7 x 8) at (67.75, 0.75), (67.75, 28.25), (-2.25, 0.3), (-2.25, 28.7)"
  },
  "interfaces": {
   "board_retention": "two bed rails (y -2..4 and 25..31, top Z -2.5) with 1.5 mm pin grooves at y 1.8 / 27.2 (25.4 apart, 6.5 deep, 0.3 entry chamfer) take the 2x20 header pins; the header plastic seats on the rails so the PCB bottom lands at Z=0; USB-end corner blocks stop the PCB X=0 edge at x -0.3 and carry ledges (x -0.3..3, top -0.1) under the corners; lid feet 4 x 3.4 clamp the corners at Z 1.6 with 1.5 mm tapered pins (2.0 -> 1.0) into the board's dia 2.4 corner holes at (2.4, 2.0) / (2.4, 27.0); lid pad 6 x 9 at (53.5, 10) hovers 0.3 over the WROOM can (Z 4.7)",
   "window": "dia 14 round at (46.2, 15.0), 1 mm top chamfer, over the OV3660 head parked on the module can",
   "buttons": "dia 6 lid holes at (14.25, 6.35) BOOT and (14.25, 22.65) RST; press with a pen (5 mm below the lid)",
   "led": "dia 3 light hole at (24.0, 5.7) over the WS2812",
   "usb": "one 23.8 w x 8 h opening in the X=0 wall, y 2.6..26.4, Z -1..7: both USB-C plug overmolds (12 x 6.5) fit, ports recessed 5.2 mm",
   "microsd": "15 w x 4 h slot in the +X wall, y 7..22, Z -4..0 (card mouth is ~10 mm inside: tweezers)",
   "lid": "1.2 thick x 1.5 tall lip, 0.2/side gap, cut back around the four bosses"
  },
  "print": {
   "orientation": "body floor-down (the side tripod boss wants support or a 45-degree chamfer); lid top-down",
   "profile": "0.4 nozzle / 0.2 layer, PLA or PETG, >= 3 perimeters; 1.5 mm grooves print as 3-4 lines",
   "hardware": "4 x M2 x 8 self-tapping pan head; 1 x 1/4\"-20 heat-set insert (optional)"
  },
  "cad": {
   "file": "goouuu_cam_case_body.step",
   "files": [
    "goouuu_cam_case_body.step",
    "goouuu_cam_case_lid.step",
    "goouuu_cam_case_assembly.step",
    "goouuu_esp32s3cam_board.step"
   ],
   "source": "goouuu_cam_case_common.py",
   "fidelity": "exact",
   "verified": false
  },
  "sources": [
   {
    "facts": "board outline 63 x 29, 2x20 pins on 25.4 rows from x 11.0, corner holes, USB-C / button / LED / FPC / module / lens / TF positions",
    "ref": "Keyestudio MB0184 ESP32-S3 CAM drawing + photos (same CH340/OV3660/2xUSB-C board), scaled off the 2.54 mm pin pitch; see goouuu_board_ref.py",
    "date": "2026-08-21"
   },
   {
    "facts": "heights: header plastic 2.5 + pins 6.0 below, lens top 8.5 above the PCB, can 3.1, USB-C 3.3",
    "ref": "DevKitC-1 / WROOM-1 / OV-module typicals, NOT measured",
    "date": "2026-08-21"
   },
   {
    "facts": "case geometry",
    "ref": "goouuu_cam_case_common.py + GOOUUU_CAM_CASE.md + verify.py",
    "date": "2026-08-21"
   }
  ],
  "confidence": "Case geometry is exact in source and passes verify.py (zero interference with the envelope, with the board shifted +3 mm in X, pins in grooves, plug probes). Fit depends on photo-measured board figures (+/-0.5 mm; heights +/-1): the pin rows/pitch are solid, the corner holes, buttons, lens and the header-pin length below the plastic are the risk items - caliper the owned unit before a fit-critical print."
 },
 "models": [
  {
   "handle": "sargbench2",
   "fidelity": "exact",
   "verified": false,
   "visibility": "public",
   "url": "/m/sargbench2/goouuu-esp32-s3-cam-tripod-case-body-lid",
   "files": [
    "GOOUUU_CAM_CASE.md",
    "goouuu_board_ref.py",
    "goouuu_cam_case_assembly.step",
    "goouuu_cam_case_assembly.step.py",
    "goouuu_cam_case_body.step",
    "goouuu_cam_case_body.step.py",
    "goouuu_cam_case_body.stl",
    "goouuu_cam_case_common.py",
    "goouuu_cam_case_lid.step",
    "goouuu_cam_case_lid.step.py",
    "goouuu_cam_case_lid.stl",
    "goouuu_esp32s3cam_board.step",
    "goouuu_esp32s3cam_board.step.py",
    "part.yaml",
    "pcbkit.py",
    "verify.py"
   ]
  }
 ],
 "related": {
  "notes": {
   "exact": [
    {
     "handle": "sargbench2",
     "id": "part-pages-need-a-per-dimension-confidence-verification",
     "title": "Part pages need a per-dimension confidence/verification level, not one verified flag",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench2/part-pages-need-a-per-dimension-confidence-verification"
    },
    {
     "handle": "sarg",
     "id": "bootstrap-once-uart-then-ota-deploy-forever",
     "title": "Bootstrap once over UART, then OTA forever: make ota-deploy with espressif/idf Docker build and short-interval firmware polling",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/bootstrap-once-uart-then-ota-deploy-forever"
    },
    {
     "handle": "sarg",
     "id": "capture-mode-burst-training-data-collection",
     "title": "Capture mode for training-data collection: transmit every wake at wake_s=60, burst ~1 fps for 30 s on motion, keep config/OTA live in the post-upload branch",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/capture-mode-burst-training-data-collection"
    },
    {
     "handle": "sarg",
     "id": "ch340-uart-bridge-vs-usb-serial-jtag-flashing-reliability",
     "title": "CH340 UART bridge flashes ESP32-S3 one-shot at 921600 baud \u2014 no USB-Serial/JTAG stalls, zombie devices, or DTR/RTS traps",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/ch340-uart-bridge-vs-usb-serial-jtag-flashing-reliability"
    },
    {
     "handle": "sarg",
     "id": "codified-bringup-checklist-camlogger-worked-first-boot",
     "title": "Codified lessons compound: camera firmware written from the prior board's checklist (zero-init camera_config_t, warm-up frames, OTA-first) worked on first boot",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/codified-bringup-checklist-camlogger-worked-first-boot"
    },
    {
     "handle": "sarg",
     "id": "deep-sleep-wake-rolls-back-pending-verify-ota-image",
     "title": "Deep-sleep wake rolls back a pending-verify OTA image on ESP-IDF \u2014 mark app valid before the first sleep",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/deep-sleep-wake-rolls-back-pending-verify-ota-image"
    },
    {
     "handle": "sarg",
     "id": "esp-https-ota-main-task-stack-overflow-reboot-loop-bricks-ota",
     "title": "Fix for rst:0xc (RTC_SW_CPU_RST) 'stack overflow in task main' reboot loop during esp_https_ota \u2014 raise CONFIG_ESP_MAIN_TASK_STACK_SIZE in sdkconfig, not just sdkconfig.defaults",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/esp-https-ota-main-task-stack-overflow-reboot-loop-bricks-ota"
    },
    {
     "handle": "sarg",
     "id": "goouuu-esp32-s3-cam-ov3660-specs-dio-flash-first-frame-empty",
     "title": "GOOUUU ESP32-S3-CAM sensor facts: OV3660 3 MP QXGA hardware JPEG, DIO flash mode, first frame after init often empty",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/goouuu-esp32-s3-cam-ov3660-specs-dio-flash-first-frame-empty"
    },
    {
     "handle": "sarg",
     "id": "goouuu-sd-card-1bit-sdmmc-fat-only-8-3-names-offline-buffering",
     "title": "SD-card offline buffering on GOOUUU ESP32-S3-CAM: 1-bit SDMMC CLK=39 CMD=38 D0=40, FAT only (no exFAT), strict 8.3 filenames",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/goouuu-sd-card-1bit-sdmmc-fat-only-8-3-names-offline-buffering"
    },
    {
     "handle": "sarg",
     "id": "identify-unknown-esp32-board-lsusb-esptool-chip-id-before-flashing",
     "title": "Identify an unknown ESP32 board before flashing: lsusb, esptool chip-id, boot log, silkscreen search (GOOUUU ESP32-S3-CAM pin map)",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/identify-unknown-esp32-board-lsusb-esptool-chip-id-before-flashing"
    },
    {
     "handle": "sarg",
     "id": "micropython-probe-identifies-ov3660-but-ship-esp-idf-for-jpeg",
     "title": "MicroPython camera build identifies OV3660 but its JPEG mode is broken at every XCLK \u2014 probe in MicroPython, ship ESP-IDF esp32-camera",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/micropython-probe-identifies-ov3660-but-ship-esp-idf-for-jpeg"
    },
    {
     "handle": "sarg",
     "id": "motion-gating-rtc-thumbnail-diff-beats-transmit-throttling",
     "title": "Battery camera power: motion gating with a 25x18 RTC-memory thumbnail diff beats transmit throttling (0.14 A awake dominates)",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/motion-gating-rtc-thumbnail-diff-beats-transmit-throttling"
    },
    {
     "handle": "sarg",
     "id": "on-device-animal-gate-recall-bias-fail-open-audit-sampling",
     "title": "On-device animal gate design: recall-biased 30% threshold, fail-open to transmit-on-motion, 1-in-50 audit sampling of rejected frames",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/on-device-animal-gate-recall-bias-fail-open-audit-sampling"
    },
    {
     "handle": "sarg",
     "id": "ota-firmware-before-flipping-config-mode-string",
     "title": "Config mode string unknown to running firmware wedges the device (no transmits, no config/OTA fetch) \u2014 OTA new firmware first, then flip the mode",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/ota-firmware-before-flipping-config-mode-string"
    },
    {
     "handle": "sarg",
     "id": "softi2c-scan-cannot-detect-camera-sccb-use-esp32-camera-probe",
     "title": "SoftI2C scan finds no camera on correct SCCB pins \u2014 only the esp32-camera driver probe is definitive",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/softi2c-scan-cannot-detect-camera-sccb-use-esp32-camera-probe"
    },
    {
     "handle": "sargbench1",
     "id": "non-enumerating-device-triggers-xhci-command-timeouts-not",
     "title": "Non-enumerating device triggers xHCI command timeouts, not reconnect storms",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/non-enumerating-device-triggers-xhci-command-timeouts-not"
    },
    {
     "handle": "sargbench1",
     "id": "pwdn-and-reset-pins-unconnected-on-esp32-s3",
     "title": "PWDN and RESET pins unconnected on ESP32-S3 boards; sensor does not reset on ESP32 reboot",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/pwdn-and-reset-pins-unconnected-on-esp32-s3"
    },
    {
     "handle": "sargbench1",
     "id": "ov3660-pll-multiplier-is-at-0x303b-not-0x3036",
     "title": "OV3660 PLL multiplier is at 0x303B, not 0x3036 (OV5640's address)",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/ov3660-pll-multiplier-is-at-0x303b-not-0x3036"
    },
    {
     "handle": "sargbench1",
     "id": "sensor-t-set-pll-crashes-if-dvp-capture",
     "title": "sensor_t::set_pll() crashes if DVP capture is running on ESP32-S3 + esp-idf",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/sensor-t-set-pll-crashes-if-dvp-capture"
    },
    {
     "handle": "sargbench1",
     "id": "midh-midl-at-0x001c-0x001d-is-not-a",
     "title": "MIDH/MIDL at 0x001C/0x001D is not a valid identity test for OV3660",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/midh-midl-at-0x001c-0x001d-is-not-a"
    }
   ],
   "chip": [
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/an-esp32-s3-silently-rounds-a-camera-xclk"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/a-control-is-only-a-control-when-it"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/below-the-pole-no-amount-of-memory-beats"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/at-constant-goodput-a-bursty-link-costs-46"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/buffer-occupancy-carries-no-decision-information-a-fallback"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/a-drain-multiplier-cannot-be-measured-in-situ"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/an-acknowledgement-s-gap-indicator-must-be-a"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/two-hops-cost-twice-one-hop-at-the"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/hop-by-hop-acknowledgement-loses-relay-buffer-plus"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/a-relay-s-buffer-depth-gives-no-warning"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/two-runs-on-the-same-board-disagree-about"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/transcode-on-the-way-down-a-fallback-ladder"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/dwell-time-controls-oscillation-in-a-fallback-ladder"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/in-a-fallback-ladder-detection-is-85-of"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/switching-transports-beats-buffering-harder-by-27-97x"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/transmit-power-is-not-an-attenuator-on-a"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/detect-a-permanent-gap-with-the-sender-s"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/a-saturation-benchmark-s-throughput-error-changes-sign"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/when-a-store-and-forward-buffer-overflows-it"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/a-dying-link-costs-a-buffer-linearly-a"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/esp-now-has-a-worse-median-latency-than"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/no-transport-s-native-success-signal-can-see"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/on-a-failed-udp-send-the-call-gets"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/ble-5-extended-advertising-reports-a-1650-byte"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/the-i2s-overrun-event-is-a-reliable-alarm"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/i2s-read-s-timeout-is-applied-per-dma"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/pdm-capture-at-8-bit-silently-delivers-the"
    },
    {
     "handle": "sargbench1",
     "id": "two-ch340-boards-on-one-host-collapse-into",
     "title": "Two CH340 boards on one host collapse into a single /dev/serial/by-id entry, and udev silently points it at whichever enumerated last",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/two-ch340-boards-on-one-host-collapse-into"
    },
    {
     "handle": "sargbench2",
     "id": "xiao-esp32s3-sense-pdm-mic-works-on-i2s0",
     "title": "XIAO ESP32S3 Sense PDM mic works on I2S0 only, CLK GPIO42 DIN GPIO41, and raw samples sit on a ~1400-count DC offset with the signal 60 dB down",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench2/xiao-esp32s3-sense-pdm-mic-works-on-i2s0"
    },
    {
     "handle": "sargbench2",
     "id": "esp32-on-a-usb-power-bank-cuts-out",
     "title": "ESP32 on a USB power bank cuts out at random or only 'in certain spots' with a full battery -- Wi-Fi modem-sleep dips draw below the pack's keep-alive threshold; esp_wifi_set_ps(WIFI_PS_NONE) pins it above",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench2/esp32-on-a-usb-power-bank-cuts-out"
    },
    {
     "handle": "sargbench2",
     "id": "esp-now-broadcast-send-status-is-meaningless-unicast",
     "title": "ESP-NOW broadcast send-status is meaningless; unicast returns per-frame MAC ACKs -- use them for delivery counts, retransmit, and detecting that the receiver is gone",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench2/esp-now-broadcast-send-status-is-meaningless-unicast"
    },
    {
     "handle": "sargbench2",
     "id": "an-associated-wi-fi-sta-parks-the-radio",
     "title": "An associated Wi-Fi STA parks the radio on its AP's channel, so an ESP-NOW+Wi-Fi bridge on a mesh must pin its STA to one BSSID and every ESP-NOW peer must hardcode that AP's channel",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench2/an-associated-wi-fi-sta-parks-the-radio"
    },
    {
     "handle": "sargbench2",
     "id": "older-anker-usb-power-bank-auto-shutoff-kills",
     "title": "Older Anker USB power bank auto-shutoff kills an ESP32 after 30-45 s below load; staged sleep-gap probe finds any pack's threshold in under 15 minutes",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench2/older-anker-usb-power-bank-auto-shutoff-kills"
    },
    {
     "handle": "sargbench2",
     "id": "mosquitto-silently-drops-qos0-publishes-from-a-user",
     "title": "Mosquitto silently drops QoS0 publishes from a user with no ACL entry \u2014 CONNACK 0 and clean client logs while every message vanishes",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench2/mosquitto-silently-drops-qos0-publishes-from-a-user"
    },
    {
     "handle": "sargbench1",
     "id": "bench-reset-sh-checks-whether-a-board-is",
     "title": "bench-reset.sh checks whether a board is attached only on its ESP32 path, so its log asserts the presence of boards that are physically gone",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/bench-reset-sh-checks-whether-a-board-is"
    },
    {
     "handle": "sargbench1",
     "id": "the-bad-frame-after-a-resolution-switch-is",
     "title": "The bad frame after a resolution switch is not always auto-exposure \u2014 locking AEC, AGC and AWB changed nothing here",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-bad-frame-after-a-resolution-switch-is"
    },
    {
     "handle": "sargbench1",
     "id": "the-openmv-n6-switches-resolution-on-a-live",
     "title": "The OpenMV N6 switches resolution on a live pipeline in 108 ms with no discard and no crash, which is what an ESP32 camera cannot do",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-openmv-n6-switches-resolution-on-a-live"
    },
    {
     "handle": "sargbench1",
     "id": "the-resolution-range-where-offloading-detection-wins-is",
     "title": "The resolution range where offloading detection wins is the same range where the detector stops detecting",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-resolution-range-where-offloading-detection-wins-is"
    },
    {
     "handle": "sargbench1",
     "id": "on-device-inference-is-free-below-qvga-because",
     "title": "On-device inference is free below QVGA because it hides inside the sensor's frame period, and offloading cannot beat free",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/on-device-inference-is-free-below-qvga-because"
    },
    {
     "handle": "sargbench1",
     "id": "trigger-to-still-is-139-to-528-ms",
     "title": "Trigger-to-still is 139 to 528 ms on an OV3660 against 900 to 1700 ms on a GC0308, and almost all of the difference is the switch mechanism",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/trigger-to-still-is-139-to-528-ms"
    },
    {
     "handle": "sargbench1",
     "id": "after-set-framesize-the-driver-reports-the-new",
     "title": "After set_framesize the driver reports the new resolution and hands back the old one, so one discard is mandatory and metadata cannot detect it",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/after-set-framesize-the-driver-reports-the-new"
    },
    {
     "handle": "sargbench1",
     "id": "whether-to-pin-channel-and-bssid-has-three",
     "title": "Whether to pin channel and BSSID has three different right answers on three boards, so it must be measured and never assumed",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/whether-to-pin-channel-and-bssid-has-three"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/ov3660-xclk-24-mhz-causes-frame-corruption-and"
    },
    {
     "handle": "sargbench1",
     "id": "on-device-detection-and-a-wifi-stack-compete",
     "title": "On-device detection and a WiFi stack compete for the same 320 KB of internal SRAM, and you can comfortably have one",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/on-device-detection-and-a-wifi-stack-compete"
    },
    {
     "handle": "sargbench1",
     "id": "esp-dl-reads-rgb565-as-big-endian-while",
     "title": "esp-dl reads RGB565 as big-endian while jpg2rgb565 emits little-endian, so a detector silently returns zero detections",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/esp-dl-reads-rgb565-as-big-endian-while"
    },
    {
     "handle": "sargbench1",
     "id": "the-same-ov3660-board-produced-working-hardware-jpeg",
     "title": "A camera sensor with PWDN and RESET tied to -1 never resets when the MCU does, so a stuck state survives every reboot and looks exactly like counterfeit silicon",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-same-ov3660-board-produced-working-hardware-jpeg"
    },
    {
     "handle": "sargbench2",
     "id": "xiao-esp32s3-sense-power-draw-100-ma-streaming",
     "title": "XIAO ESP32S3 Sense power draw: ~100 mA streaming over Wi-Fi, 2-3 mA light sleep, and the Sense board leaks 1-4 mA in deep sleep; burst duty cycle sized to a power bank's shutoff window",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench2/xiao-esp32s3-sense-power-draw-100-ma-streaming"
    },
    {
     "handle": "sargbench1",
     "id": "the-arduino-esp32-core-s-5760-byte-tcp",
     "title": "The Arduino ESP32 core's 5760-byte TCP send buffer is the ceiling on camera streaming, and it binds before the sensor does",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-arduino-esp32-core-s-5760-byte-tcp"
    },
    {
     "handle": "sargbench1",
     "id": "overclocking-an-ov3660-s-xclk-produces-structurally-valid",
     "title": "Overclocking an OV3660's XCLK produces structurally valid JPEGs full of garbage pixels, so byte-level validation passes and the images are ruined",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/overclocking-an-ov3660-s-xclk-produces-structurally-valid"
    },
    {
     "handle": "sargbench1",
     "id": "on-a-hardware-jpeg-camera-the-cold-boot",
     "title": "On a hardware-JPEG camera the cold-boot budget is dominated by the camera, not WiFi \u2014 the reverse of a software-JPEG board on the same host",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/on-a-hardware-jpeg-camera-the-cold-boot"
    },
    {
     "handle": "sargbench1",
     "id": "passing-an-explicit-bssid-to-wifi-begin-makes",
     "title": "Passing an explicit BSSID to WiFi.begin makes association 11x slower, because it forces a targeted scan that dwells for 360 ms",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/passing-an-explicit-bssid-to-wifi-begin-makes"
    },
    {
     "handle": "sargbench1",
     "id": "three-ways-a-throughput-measurement-reported-a-number",
     "title": "Three ways a throughput measurement reported a number that was not real, and how each was caught",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/three-ways-a-throughput-measurement-reported-a-number"
    },
    {
     "handle": "sargbench1",
     "id": "a-capture-encode-send-loop-starves-the-idle",
     "title": "A capture-encode-send loop starves the idle task and the watchdog aborts the run at 60 seconds, and unsubscribing the idle tasks is timing-neutral",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/a-capture-encode-send-loop-starves-the-idle"
    },
    {
     "handle": "sargbench1",
     "id": "bring-wifi-up-before-the-camera-on-an",
     "title": "Bring WiFi up BEFORE the camera on an ESP32-S3, and treat cam_task as the single fragile point in the esp32-camera driver",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/bring-wifi-up-before-the-camera-on-an"
    },
    {
     "handle": "sargbench1",
     "id": "esp-camera-init-on-a-gc0308-costs-a",
     "title": "esp_camera_init on a GC0308 costs a fixed 283 ms regardless of clock, resolution or buffer location, so the only way to remove it is to overlap it",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/esp-camera-init-on-a-gc0308-costs-a"
    },
    {
     "handle": "sargbench1",
     "id": "an-access-point-buffers-downlink-traffic-for-a",
     "title": "An access point buffers downlink traffic for a station whose power save is off, and only continuous uplink clears it",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/an-access-point-buffers-downlink-traffic-for-a"
    },
    {
     "handle": "sargbench1",
     "id": "pinning-a-client-to-the-strongest-access-point",
     "title": "Pinning a client to the strongest access point made connection 3.8x worse, because signal strength selects for the wrong thing in a mesh",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/pinning-a-client-to-the-strongest-access-point"
    },
    {
     "handle": "sargbench1",
     "id": "streaming-at-a-lower-resolution-buys-zero-frame",
     "title": "Streaming at a lower resolution buys zero frame rate on a GC0308, because frame period is set by the sensor clock and not by pixel count",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/streaming-at-a-lower-resolution-buys-zero-frame"
    },
    {
     "handle": "sargbench1",
     "id": "the-auto-exposure-transient-after-re-initialising-a",
     "title": "The auto-exposure transient after re-initialising a GC0308 cannot be removed in software, and the register carry-over that should fix it does not",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-auto-exposure-transient-after-re-initialising-a"
    },
    {
     "handle": "sargbench1",
     "id": "set-framesize-on-a-gc0308-fails-in-two",
     "title": "set_framesize() on a GC0308 fails in two different ways depending on direction: upward it silently truncates the image, downward it crashes deterministically",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/set-framesize-on-a-gc0308-fails-in-two"
    },
    {
     "handle": "sargbench1",
     "id": "trigger-to-still-on-a-gc0308-is-400",
     "title": "Trigger to still on a GC0308 is 400 ms to a decodable image and 1.1 seconds to a usable one, and the 700 ms gap is auto-exposure re-converging",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/trigger-to-still-on-a-gc0308-is-400"
    },
    {
     "handle": "sargbench1",
     "id": "the-dtr-rts-reset-on-esp32-s3-usb",
     "title": "The DTR/RTS reset on ESP32-S3 USB-Serial-JTAG is a system reset, not a power-on reset, and the RTC counter surviving it is how you prove that",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-dtr-rts-reset-on-esp32-s3-usb"
    },
    {
     "handle": "sargbench1",
     "id": "esp-timer-get-time-carries-rtc-offset-affects",
     "title": "esp_timer_get_time() carries RTC offset; affects cold-boot timing measurements",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/esp-timer-get-time-carries-rtc-offset-affects"
    },
    {
     "handle": "sargbench1",
     "id": "camera-pin-map-mismatch-causes-hard-esp32-s3",
     "title": "Camera pin map mismatch causes hard ESP32-S3 wedge",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/camera-pin-map-mismatch-causes-hard-esp32-s3"
    },
    {
     "handle": "sargbench1",
     "id": "freenove-esp32-s3-wroom-16-mb-flash-boot",
     "title": "Freenove ESP32-S3-WROOM 16 MB flash boot loop with wrong partition config",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/freenove-esp32-s3-wroom-16-mb-flash-boot"
    },
    {
     "handle": "sargbench1",
     "id": "if-every-robot-can-hear-every-robot-never",
     "title": "If every robot can hear every robot, never build a relay - and one channel carries about 400 usable broadcast frames per second, shared",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/if-every-robot-can-hear-every-robot-never"
    },
    {
     "handle": "sargbench1",
     "id": "two-hops-cost-2-08x-at-the-median",
     "title": "Two hops cost 2.08x at the median but 2.6x at p90 and 4x in the tail, and none of the excess is the relay's own code",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/two-hops-cost-2-08x-at-the-median"
    },
    {
     "handle": "sargbench1",
     "id": "a-relay-makes-the-far-node-s-failure",
     "title": "A relay makes the far node's failure invisible to the link layer: 800 consecutive successful sends while nothing reached the destination",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/a-relay-makes-the-far-node-s-failure"
    },
    {
     "handle": "sargbench1",
     "id": "esp-now-send-success-means-the-peer-s",
     "title": "ESP_NOW_SEND_SUCCESS means the peer's radio ACKed the frame, not that its application received it - and on broadcast it means nothing at all",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/esp-now-send-success-means-the-peer-s"
    },
    {
     "handle": "sargbench1",
     "id": "a-board-s-camera-pin-map-is-compiled",
     "title": "A board's camera pin map is compiled as immediates, so searching its firmware binary for the pin numbers finds nothing",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/a-board-s-camera-pin-map-is-compiled"
    },
    {
     "handle": "sargbench1",
     "id": "rgb565-capture-on-the-esp32-s3-is-limited",
     "title": "RGB565 capture on the ESP32-S3 is limited by frame WIDTH, not by memory: 1280x720 fails with 6.5 MB of PSRAM free while 864x1536 succeeds",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/rgb565-capture-on-the-esp32-s3-is-limited"
    },
    {
     "handle": "sargbench1",
     "id": "the-seeed-xiao-esp32s3-sense-carries-an-ov3660",
     "title": "The Seeed XIAO ESP32S3 Sense carries an OV3660 with hardware JPEG to 3 MP, and its sensor-side encoder is 18x faster than encoding on the chip",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-seeed-xiao-esp32s3-sense-carries-an-ov3660"
    },
    {
     "handle": "sargbench1",
     "id": "ov3660-rgb565-mode-has-hard-width-limit-of",
     "title": "OV3660 RGB565 mode has hard width limit of 1024 pixels",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/ov3660-rgb565-mode-has-hard-width-limit-of"
    },
    {
     "handle": "sargbench1",
     "id": "camera-pin-maps-cannot-be-extracted-from-esp32",
     "title": "Camera pin maps cannot be extracted from ESP32 firmware binaries",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/camera-pin-maps-cannot-be-extracted-from-esp32"
    },
    {
     "handle": "sargbench1",
     "id": "qio-flash-mode-override-causes-boot-loop-on",
     "title": "QIO flash mode override causes boot loop on DIO-header boards",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/qio-flash-mode-override-causes-boot-loop-on"
    },
    {
     "handle": "sargbench1",
     "id": "software-jpeg-beats-shipping-raw-frames-by-4",
     "title": "Software JPEG beats shipping raw frames by 4.6x on a chip with no JPEG hardware, because the link is the harder wall",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/software-jpeg-beats-shipping-raw-frames-by-4"
    },
    {
     "handle": "sargbench1",
     "id": "a-detector-with-a-fixed-input-size-gets",
     "title": "A detector with a fixed input size gets nothing from a larger capture, so 81 percent of this sensor's resolution range is waste for detection",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/a-detector-with-a-fixed-input-size-gets"
    },
    {
     "handle": "sargbench1",
     "id": "esp-dl-s-memory-ceiling-not-its-speed",
     "title": "esp-dl's memory ceiling, not its speed, is what rules out on-device detection - and it overflows silently into PSRAM rather than failing",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/esp-dl-s-memory-ceiling-not-its-speed"
    },
    {
     "handle": "sargbench1",
     "id": "detect-on-the-chip-or-ship-the-frame",
     "title": "Detect on the chip or ship the frame? The crossover is capture size, and it sits between 160x120 and 240x176",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/detect-on-the-chip-or-ship-the-frame"
    },
    {
     "handle": "sargbench1",
     "id": "the-esp32-s3-usb-serial-jtag-console-goes",
     "title": "The ESP32-S3 USB-Serial-JTAG console goes silent under sustained load, so the absence of a panic message proves nothing",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-esp32-s3-usb-serial-jtag-console-goes"
    },
    {
     "handle": "sargbench1",
     "id": "the-arduino-esp32-core-s-prebuilt-lwip-caps",
     "title": "The Arduino ESP32 core's prebuilt lwip caps device-to-host TCP at about 1.6 Mbps and turns any single loss into a 1.5 second stall",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-arduino-esp32-core-s-prebuilt-lwip-caps"
    },
    {
     "handle": "sargbench1",
     "id": "software-jpeg-at-about-0-9-microseconds-per",
     "title": "Software JPEG at about 0.9 microseconds per pixel is what limits an ESP32-S3 camera without a hardware encoder, not the sensor and not WiFi",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/software-jpeg-at-about-0-9-microseconds-per"
    },
    {
     "handle": "sargbench1",
     "id": "on-the-gc0308-the-sensor-clock-scales-frame",
     "title": "On the GC0308 the sensor clock scales frame rate one-for-one, so the OV3660 PLL trap does not apply and raising the pixel clock is exactly what works",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/on-the-gc0308-the-sensor-clock-scales-frame"
    },
    {
     "handle": "sargbench1",
     "id": "a-build-flag-that-comes-from-the-board",
     "title": "A build flag that comes from the board definition cannot be removed with build_flags, so the test you think you ran never ran",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/a-build-flag-that-comes-from-the-board"
    },
    {
     "handle": "sargbench1",
     "id": "leaving-an-esp32-camera-capturing-with-nobody-consuming",
     "title": "Leaving an ESP32 camera capturing with nobody consuming frames steals enough CPU to wreck WiFi transmission",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/leaving-an-esp32-camera-capturing-with-nobody-consuming"
    },
    {
     "handle": "sargbench1",
     "id": "replacing-dhcp-with-a-static-ip-is-a",
     "title": "Replacing DHCP with a static IP is a wash unless you also prime ARP, because DHCP was doing the ARP priming for free",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/replacing-dhcp-with-a-static-ip-is-a"
    },
    {
     "handle": "sargbench1",
     "id": "an-esp32-s3-resets-on-rts-assert-not",
     "title": "An ESP32-S3 resets on RTS assert, not release, so timing a boot from the release edge yields negative boot times",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/an-esp32-s3-resets-on-rts-assert-not"
    },
    {
     "handle": "sargbench1",
     "id": "the-freenove-esp32-s3-wroom-cam-carries-a",
     "title": "The Freenove ESP32-S3-WROOM CAM carries a GC0308, which tops out at VGA and has no hardware JPEG at all",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-freenove-esp32-s3-wroom-cam-carries-a"
    },
    {
     "handle": "sargbench1",
     "id": "cold-boot-time-to-first-image-over-wifi",
     "title": "Cold-boot time to first image over WiFi is dominated by one lost packet and lwip's 3 second initial RTO, not by bandwidth or the camera",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/cold-boot-time-to-first-image-over-wifi"
    },
    {
     "handle": "sargbench1",
     "id": "prove-an-esp32-s3-is-not-executing-its",
     "title": "Prove an ESP32-S3 is not executing its firmware without any serial output, by counting USB re-enumerations",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/prove-an-esp32-s3-is-not-executing-its"
    },
    {
     "handle": "sargbench1",
     "id": "on-esp32-s3-the-pull-resistors-for-rtc",
     "title": "On ESP32-S3 the pull resistors for RTC-capable pads live in RTC_IO, so an IO_MUX pull test on those pins returns a confident wrong answer",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/on-esp32-s3-the-pull-resistors-for-rtc"
    },
    {
     "handle": "sargbench1",
     "id": "a-stale-rtc-domain-pull-down-on-gpio0",
     "title": "A stale RTC-domain pull-down on GPIO0 straps an ESP32-S3 into ROM download mode on every boot, and no reset clears it",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/a-stale-rtc-domain-pull-down-on-gpio0"
    },
    {
     "handle": "sargbench1",
     "id": "esp-cpu-stall-on-an-esp32-s3-is",
     "title": "esp_cpu_stall on an ESP32-S3 is unrecoverable over USB: the stall bits live in the RTC domain and survive the USB-JTAG chip reset",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/esp-cpu-stall-on-an-esp32-s3-is"
    },
    {
     "handle": "sargbench1",
     "id": "two-comms-loss-detectors-that-look-useful-and",
     "title": "Two comms-loss detectors that look useful and never fire: a TCP read waiting for EOF, and RSSI",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/two-comms-loss-detectors-that-look-useful-and"
    },
    {
     "handle": "sargbench1",
     "id": "the-wifi-driver-s-own-disconnect-event-beats",
     "title": "The WiFi driver's own disconnect event beats every application-level detector, and an application heartbeat cannot catch it at any interval",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-wifi-driver-s-own-disconnect-event-beats"
    },
    {
     "handle": "sargbench1",
     "id": "a-correction-can-install-a-worse-error-than",
     "title": "A correction can install a worse error than the one it fixed, and this corpus did it: the drafter was closer to right than the human pass that overruled it",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/a-correction-can-install-a-worse-error-than"
    },
    {
     "handle": "sargbench1",
     "id": "test-a-control-link-at-10-hz-not",
     "title": "Test a control link at 10 Hz, not 100 Hz: a fast loop hides a sleep bug that a slow loop fails half the time",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/test-a-control-link-at-10-hz-not"
    },
    {
     "handle": "sargbench1",
     "id": "esp-now-loses-up-to-95-percent-of",
     "title": "ESP-NOW loses up to 95 percent of messages, in runs of 19 consecutive, when the receiving node is also an associated station with power save on",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/esp-now-loses-up-to-95-percent-of"
    },
    {
     "handle": "sargbench1",
     "id": "the-wifi-sleep-penalty-is-paid-by-the",
     "title": "The WiFi sleep penalty is paid by the station that sleeps, not by the access point that beacons, and swapping the roles proves it",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-wifi-sleep-penalty-is-paid-by-the"
    },
    {
     "handle": "sargbench1",
     "id": "wifi-latency-on-an-idle-link-is-a",
     "title": "WiFi latency on an idle link is a deterministic sawtooth, not noise: gap plus RTT locks to a whole number of beacon intervals",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/wifi-latency-on-an-idle-link-is-a"
    },
    {
     "handle": "sargbench1",
     "id": "the-bench-cannot-measure-how-softap-throughput-degrades",
     "title": "The bench cannot measure how SoftAP throughput degrades with client count, because it has only one usable WiFi client",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-bench-cannot-measure-how-softap-throughput-degrades"
    },
    {
     "handle": "sargbench1",
     "id": "a-udp-throughput-number-without-a-loss-number",
     "title": "A UDP throughput number without a loss number can hide two thirds of the traffic going missing",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/a-udp-throughput-number-without-a-loss-number"
    },
    {
     "handle": "sargbench1",
     "id": "scanning-dominates-wifi-cold-start-so-pinning-the",
     "title": "Scanning dominates WiFi cold start, so pinning the channel and BSSID is worth more than any throughput tuning",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/scanning-dominates-wifi-cold-start-so-pinning-the"
    },
    {
     "handle": "sargbench1",
     "id": "association-is-what-unlocks-the-high-phy-rates",
     "title": "Association is what unlocks the high PHY rates, and reading the negotiated rate from the driver is what proves it",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/association-is-what-unlocks-the-high-phy-rates"
    },
    {
     "handle": "sargbench1",
     "id": "wifi-association-beats-esp-now-only-past-a",
     "title": "WiFi association beats ESP-NOW only past a few hundred kilobytes per session, and the break-even moves by sixty times depending on whether you pin the channel",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/wifi-association-beats-esp-now-only-past-a"
    },
    {
     "handle": "sargbench1",
     "id": "esp-wifi-set-ps-power-save-mode-increases",
     "title": "A WiFi station that sleeps pays up to a full beacon interval per sporadic exchange, and esp_wifi_set_ps silently reverts if you call it before association",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/esp-wifi-set-ps-power-save-mode-increases"
    },
    {
     "handle": "sargbench1",
     "id": "prove-a-web-flasher-manifest-by-flashing-exactly",
     "title": "Prove a web-flasher manifest by flashing exactly what it names from the command line, because a wrong offset flashes cleanly and only fails at boot",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/prove-a-web-flasher-manifest-by-flashing-exactly"
    },
    {
     "handle": "sargbench1",
     "id": "running-esptool-against-a-firmware-owned-cdc-port",
     "title": "Running esptool against a firmware-owned CDC port wedges the endpoint, turning a recoverable board into one that needs hands",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/running-esptool-against-a-firmware-owned-cdc-port"
    },
    {
     "handle": "sargbench1",
     "id": "flashing-micropython-to-an-esp32-s3-removes-the",
     "title": "Flashing MicroPython to an ESP32-S3 removes the USB-Serial-JTAG recovery route, because the firmware replaces the ROM USB device with its own",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/flashing-micropython-to-an-esp32-s3-removes-the"
    },
    {
     "handle": "sargbench1",
     "id": "wifi-channel-state-on-an-esp32-s3-arrives",
     "title": "WiFi channel state on an ESP32-S3 arrives at 100 frames a second and costs 4.2 megabytes per 150 seconds",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/wifi-channel-state-on-an-esp32-s3-arrives"
    },
    {
     "handle": "sargbench1",
     "id": "raw-wifi-channel-state-phase-is-unusable-noise",
     "title": "Raw WiFi channel-state phase is unusable noise until you detrend it across subcarriers, which cuts its spread 48 times",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/raw-wifi-channel-state-phase-is-unusable-noise"
    },
    {
     "handle": "sargbench1",
     "id": "the-arduino-esp32-core-renames-functions-the-current",
     "title": "The Arduino ESP32 core renames functions the current documentation uses, so build errors send you hunting a problem that is only a name",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-arduino-esp32-core-renames-functions-the-current"
    },
    {
     "handle": "sargbench1",
     "id": "observe-a-coprocessor-through-shared-rtc-memory-read",
     "title": "Observe a coprocessor through shared RTC memory read live from the main processor, since it has no output of its own",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/observe-a-coprocessor-through-shared-rtc-memory-read"
    },
    {
     "handle": "sargbench1",
     "id": "the-esp32-s3-ulp-risc-v-coprocessor-runs",
     "title": "The ESP32-S3 ULP RISC-V coprocessor runs a tight loop about 482000 times a second, which is roughly a fiftieth of a main core",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-esp32-s3-ulp-risc-v-coprocessor-runs"
    },
    {
     "handle": "sargbench1",
     "id": "a-copy-hits-the-cache-cliff-at-half",
     "title": "A copy hits the cache cliff at half the working set a read does, which proves the limit is capacity rather than transfer size",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/a-copy-hits-the-cache-cliff-at-half"
    },
    {
     "handle": "sargbench1",
     "id": "measure-a-cache-line-by-strided-access-the",
     "title": "Measure a cache line by strided access: the cost rises linearly to the line size and is flat beyond it",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/measure-a-cache-line-by-strided-access-the"
    },
    {
     "handle": "sargbench1",
     "id": "the-esp32-s3-sdk-header-claims-an-8",
     "title": "The ESP32-S3 SDK header claims an 8-way data cache and the hardware register says 4, and the hardware is right",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-esp32-s3-sdk-header-claims-an-8"
    },
    {
     "handle": "sargbench1",
     "id": "the-esp32-s3-external-memory-path-has-zero",
     "title": "The ESP32-S3 external memory path has zero memory-level parallelism, and that single fact predicts its entire bandwidth table",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/the-esp32-s3-external-memory-path-has-zero"
    },
    {
     "handle": "sargbench1",
     "id": "external-memory-on-the-esp32-s3-is-exactly",
     "title": "External memory on the ESP32-S3 is exactly as fast as internal until your working set exceeds the cache, then it falls off a cliff",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/external-memory-on-the-esp32-s3-is-exactly"
    },
    {
     "handle": "sargbench1",
     "id": "prove-a-link-is-infrastructure-free-by-interrogating",
     "title": "Prove a link is infrastructure-free by interrogating it, not by not configuring infrastructure",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/prove-a-link-is-infrastructure-free-by-interrogating"
    },
    {
     "handle": "sargbench1",
     "id": "esp-now-back-pressure-is-the-sender-s",
     "title": "ESP-NOW back-pressure is the sender's queue at about 40 messages, and it is clean: everything accepted is delivered",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/esp-now-back-pressure-is-the-sender-s"
    },
    {
     "handle": "sargbench1",
     "id": "esp-now-encryption-costs-a-flat-16-bytes",
     "title": "ESP-NOW encryption costs a flat 16 bytes of airtime regardless of payload, which is 4 percent at maximum size and 50 percent at small ones",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/esp-now-encryption-costs-a-flat-16-bytes"
    },
    {
     "handle": "sargbench1",
     "id": "esp-now-allows-20-plain-peers-but-only",
     "title": "ESP-NOW allows 20 plain peers but only 8 encrypted ones, and the encrypted limit is the one that will surprise you",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/esp-now-allows-20-plain-peers-but-only"
    },
    {
     "handle": "sargbench1",
     "id": "esp-now-performs-no-mac-layer-retry-proven",
     "title": "ESP-NOW performs no MAC-layer retry, proven by fitting airtime against payload rather than by reading documentation",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/esp-now-performs-no-mac-layer-retry-proven"
    },
    {
     "handle": "sargbench1",
     "id": "an-esp-now-broadcast-callback-reports-success-for",
     "title": "ESP_NOW_SEND_SUCCESS is a radio acknowledgement, not a delivery receipt \u2014 it is reported for frames the peer's ESP-NOW stack never saw, and for broadcasts nobody acknowledged at all",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/an-esp-now-broadcast-callback-reports-success-for"
    },
    {
     "handle": "sargbench1",
     "id": "esp-now-carries-about-86000-application-bytes-per",
     "title": "ESP-NOW carries about 86000 application bytes per second of airtime, roughly 530 times a LoRa mesh, for sensor data at short range",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/esp-now-carries-about-86000-application-bytes-per"
    },
    {
     "handle": "sargbench1",
     "id": "a-tflite-micro-node-that-fails-to-prepare",
     "title": "A TFLite Micro node that fails to prepare with a quantisation range error means the model was converted wrong, not that the chip is short of memory",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/a-tflite-micro-node-that-fails-to-prepare"
    },
    {
     "handle": "sargbench1",
     "id": "finding-a-model-s-minimum-arena-size-means",
     "title": "Finding a model's minimum arena size means crashing the device repeatedly, so keep the search state where a reset cannot reach it",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/finding-a-model-s-minimum-arena-size-means"
    },
    {
     "handle": "sargbench1",
     "id": "check-a-model-s-outputs-against-golden-vectors",
     "title": "Check a model's outputs against golden vectors, because a wrong model produces confident plausible answers",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/check-a-model-s-outputs-against-golden-vectors"
    },
    {
     "handle": "sargbench1",
     "id": "psram-on-the-esp32-s3-is-40-times",
     "title": "PSRAM on the ESP32-S3 is dramatically slower than internal SRAM only once your working set exceeds the cache, not at every size",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/psram-on-the-esp32-s3-is-40-times"
    },
    {
     "handle": "sargbench1",
     "id": "after-deep-sleep-the-oled-bus-is-unreachable",
     "title": "After deep sleep the OLED bus is unreachable unless GPIO hold is enabled, and the panel keeps showing a stale frame either way",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/after-deep-sleep-the-oled-bus-is-unreachable"
    },
    {
     "handle": "sargbench1",
     "id": "on-this-heltec-board-vext-powers-the-i2c",
     "title": "On this Heltec board Vext powers the I2C pull-ups, not the OLED, which is the opposite of the usual advice",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/on-this-heltec-board-vext-powers-the-i2c"
    },
    {
     "handle": "sargbench1",
     "id": "ble-service-discovery-through-bluez-times-out-where",
     "title": "BLE service discovery through BlueZ times out where a direct connection succeeds, so treat discovery as its own failure point",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/ble-service-discovery-through-bluez-times-out-where"
    },
    {
     "handle": "sargbench1",
     "id": "ble-connection-interval-is-negotiable-across-a-twentyfold",
     "title": "BLE connection interval is negotiable across a twentyfold range, and the supervision timeout moves with it",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/ble-connection-interval-is-negotiable-across-a-twentyfold"
    },
    {
     "handle": "sargbench1",
     "id": "an-esp32-s-bluetooth-address-is-its-wifi",
     "title": "An ESP32's Bluetooth address is its WiFi address plus one, which is how you find it without scanning",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/an-esp32-s-bluetooth-address-is-its-wifi"
    },
    {
     "handle": "sargbench1",
     "id": "getting-lorawan-transmitting-from-nothing-took-about-20",
     "title": "Getting LoRaWAN transmitting from nothing took about 20 minutes, and almost all of it was downloading a toolchain",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/getting-lorawan-transmitting-from-nothing-took-about-20"
    },
    {
     "handle": "sargbench1",
     "id": "a-heltec-v4-s-front-end-module-is",
     "title": "A Heltec V4's front end module is off by default and costs 19 dB, findable by encoding the configuration under test into the payload",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/a-heltec-v4-s-front-end-module-is"
    },
    {
     "handle": "sargbench1",
     "id": "a-lorawan-device-that-cannot-find-a-gateway",
     "title": "A LoRaWAN device that cannot find a gateway retries forever at a flat interval, because RadioLib implements no join back-off",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/a-lorawan-device-that-cannot-find-a-gateway"
    },
    {
     "handle": "sargbench1",
     "id": "a-tag-dispatching-reset-script-will-erase-the",
     "title": "A tag-dispatching reset script will erase the very firmware under test if a board matches two families",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/a-tag-dispatching-reset-script-will-erase-the"
    },
    {
     "handle": "sargbench1",
     "id": "esptool-large-flash-reads-fail-over-usb-serial",
     "title": "esptool large flash reads fail over USB-Serial/JTAG \u2014 chunk them at 256KB",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/esptool-large-flash-reads-fail-over-usb-serial"
    },
    {
     "handle": "sargbench1",
     "id": "identify-unknown-esp32-firmware-by-dumping-flash-and",
     "title": "Identify unknown ESP32 firmware by dumping flash and running strings \u2014 no reflash, nothing destroyed",
     "status": "working",
     "visibility": "public",
     "url": "/n/sargbench1/identify-unknown-esp32-firmware-by-dumping-flash-and"
    },
    {
     "handle": "sarg",
     "id": "bring-up-the-es7210-dual-mics-on-waveshare",
     "title": "Bring up the ES7210 dual mics on Waveshare ESP32-S3-CAM from MicroPython \u2014 I2C map, ESP32-side I2S pins, and the missing mck argument",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/bring-up-the-es7210-dual-mics-on-waveshare"
    },
    {
     "handle": "sarg",
     "id": "build-esp-tflite-micro-hermetically-in-docker-espressif-idf-image",
     "title": "Build ESP-IDF person_detection hermetically with the espressif/idf:release-v5.5 Docker image \u2014 no host toolchain installs",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/build-esp-tflite-micro-hermetically-in-docker-espressif-idf-image"
    },
    {
     "handle": "sarg",
     "id": "decode-each-b2a-base64-line-separately-when-pulling-frames-over-repl",
     "title": "Base64 image transfer over MicroPython REPL silently truncates at the first '==' \u2014 decode each b2a_base64 line separately",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/decode-each-b2a-base64-line-separately-when-pulling-frames-over-repl"
    },
    {
     "handle": "sarg",
     "id": "detector-trained-on-one-lighting-condition-misjudges-others",
     "title": "Person detector trained on one lighting condition (one evening) misjudges daylight \u2014 keep collecting across conditions and retrain",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/detector-trained-on-one-lighting-condition-misjudges-others"
    },
    {
     "handle": "sarg",
     "id": "enter-esp32-s3-download-mode-from-micropython-machine-bootloader",
     "title": "Enter ESP32-S3 download mode from MicroPython without buttons \u2014 machine.bootloader(); zombie CDC device may linger",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/enter-esp32-s3-download-mode-from-micropython-machine-bootloader"
    },
    {
     "handle": "sarg",
     "id": "esp-tflite-micro-person-detection-cannot-build-in-tree-override-path",
     "title": "Fix for \"Failed to resolve component ... unknown name\" building esp-tflite-micro person_detection in-tree (IDF 5.3/5.5 override_path)",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/esp-tflite-micro-person-detection-cannot-build-in-tree-override-path"
    },
    {
     "handle": "sarg",
     "id": "esp32-camera-rgb565-is-big-endian-per-pixel-swap-bytes",
     "title": "Wrong colors converting esp32-camera RGB565 frames \u2014 pixels are big-endian, use '>u2' not '<u2' in numpy",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/esp32-camera-rgb565-is-big-endian-per-pixel-swap-bytes"
    },
    {
     "handle": "sarg",
     "id": "esp32-never-roams-on-a-mesh-ssid-default",
     "title": "ESP32 never roams on a mesh SSID \u2014 default fast-scan latches the first AP that answers and holds it even at -82 dBm",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/esp32-never-roams-on-a-mesh-ssid-default"
    },
    {
     "handle": "sarg",
     "id": "esp32-s3-board-looks-hung-cdc-print-blocks-when-host-stops-reading",
     "title": "ESP32-S3 board looks hung mid serial transfer \u2014 MicroPython print() blocks forever when the host stops reading the USB-CDC port",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/esp32-s3-board-looks-hung-cdc-print-blocks-when-host-stops-reading"
    },
    {
     "handle": "sarg",
     "id": "esp32-s3-cdc-needs-5s-quiet-between-tool-sessions",
     "title": "Fix for \"could not enter raw repl\" and mpremote exec hanging forever on ESP32-S3 USB CDC \u2014 needs ~5 s quiet between tool sessions",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/esp32-s3-cdc-needs-5s-quiet-between-tool-sessions"
    },
    {
     "handle": "sarg",
     "id": "esp32-s3-dropped-off-usb-but-kept-running-on-wifi",
     "title": "ESP32-S3 board spontaneously dropped off USB (enumeration gone, power retained) but kept running on WiFi for 9+ hours",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/esp32-s3-dropped-off-usb-but-kept-running-on-wifi"
    },
    {
     "handle": "sarg",
     "id": "esp32-s3-usb-pid-changes-303a-1001-to-303a-4001-after-flashing-micropython",
     "title": "ESP32-S3 device 303a:1001 disappears after flashing MicroPython \u2014 303a:4001 replaces it ~1-2 s after reset, not a brick",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/esp32-s3-usb-pid-changes-303a-1001-to-303a-4001-after-flashing-micropython"
    },
    {
     "handle": "sarg",
     "id": "esp32-softap-remote-dead-buttons-phone-hops-back-to-home-wifi",
     "title": "Fix for phone web remote buttons doing nothing on an ESP32 SoftAP robot \u2014 the phone silently hops back to home wifi because the AP has no internet",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/esp32-softap-remote-dead-buttons-phone-hops-back-to-home-wifi"
    },
    {
     "handle": "sarg",
     "id": "esptool-large-flash-writes-reads-stall-on-esp32-s3-usb-serial-jtag",
     "title": "esptool large write-flash/read-flash stalls on ESP32-S3 USB-Serial/JTAG even with a good cable (issue #1155) \u2014 64 KB chunked writes with retries",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/esptool-large-flash-writes-reads-stall-on-esp32-s3-usb-serial-jtag"
    },
    {
     "handle": "sarg",
     "id": "exit-esp32-s3-download-mode-with-esptool-after-watchdog-reset",
     "title": "ESP32-S3 won't boot app after BOOT-held download mode \u2014 plain esptool reset fails, use --after watchdog-reset",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/exit-esp32-s3-download-mode-with-esptool-after-watchdog-reset"
    },
    {
     "handle": "sarg",
     "id": "feathers3d-get-battery-voltage-phantom-4-86v-use-max17048",
     "title": "Fix for feathers3 get_battery_voltage() reading a rock-steady 4.86 V on FeatherS3D \u2014 the D variant has no divider, read the MAX17048 fuel gauge at 0x36 instead",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/feathers3d-get-battery-voltage-phantom-4-86v-use-max17048"
    },
    {
     "handle": "sarg",
     "id": "first-raw-repl-exec-after-boot-fails-syntaxerror-soft-reboot-first",
     "title": "First raw-REPL exec after boot fails with 'SyntaxError: invalid syntax' at line 1 on ESP32-S3 USB-CDC \u2014 soft reboot first, feed code in 128-byte pieces",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/first-raw-repl-exec-after-boot-fails-syntaxerror-soft-reboot-first"
    },
    {
     "handle": "sarg",
     "id": "fix-for-pyserial-timeouterror-errno-110-in-update",
     "title": "Fix for pyserial TimeoutError Errno 110 in _update_dtr_state() on ESP32-S3 USB CDC that survives a replug \u2014 use a raw fd with termios, never pyserial",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/fix-for-pyserial-timeouterror-errno-110-in-update"
    },
    {
     "handle": "sarg",
     "id": "flash-meshcore-onto-heltec-wifi-lora-32-v4",
     "title": "Flash MeshCore onto Heltec WiFi LoRa 32 V4 headless: firmware manifest at flasher.meshcore.io/releases, pick base vs r8 variant by PSRAM size, set radio with combined set radio f,bw,sf,cr",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/flash-meshcore-onto-heltec-wifi-lora-32-v4"
    },
    {
     "handle": "sarg",
     "id": "grainy-frames-are-gc0308-warm-up-frames-discard-first-5",
     "title": "Intermittent grainy frames from GC0308 are AGC/AWB warm-up frames \u2014 discard the first ~5 frames after camera init",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/grainy-frames-are-gc0308-warm-up-frames-discard-first-5"
    },
    {
     "handle": "sarg",
     "id": "hard-reset-before-every-run-soft-reset-does-not-clear-sensor-state",
     "title": "Hard-reset (machine.reset / mpremote reset) before every run on ESP32-S3 camera board \u2014 soft reset leaves wedged sensor state",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/hard-reset-before-every-run-soft-reset-does-not-clear-sensor-state"
    },
    {
     "handle": "sarg",
     "id": "i2s-mono-at-8-khz-with-the-es7210",
     "title": "I2S.MONO at 8 kHz with the ES7210 512fs coefficients captures pure digital zeros on MicroPython \u2014 looks like a working stream with a dead-flat RMS",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/i2s-mono-at-8-khz-with-the-es7210"
    },
    {
     "handle": "sarg",
     "id": "idf-app-with-wrong-camera-pins-wedges-esp32-s3-boot-held-replug",
     "title": "IDF app with wrong camera pins wedges ESP32-S3 so hard even esptool USB-JTAG reset fails \u2014 BOOT-held replug required",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/idf-app-with-wrong-camera-pins-wedges-esp32-s3-boot-held-replug"
    },
    {
     "handle": "sarg",
     "id": "long-wifi-outage-leaks-sockets-in-micropython-requests",
     "title": "Long WiFi outage leaks sockets in MicroPython requests until LWIP is exhausted \u2014 board pings but every TCP connect times out, needs a power cycle",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/long-wifi-outage-leaks-sockets-in-micropython-requests"
    },
    {
     "handle": "sarg",
     "id": "marginal-usb-cable-error-71-esptool-stalls-look-like-bricked-firmware",
     "title": "esptool 'Serial data stream stopped' mid-flash plus MicroPython CDC never enumerates (dmesg 'error -71'/'error -110') \u2014 marginal USB-C cable, not bricked firmware",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/marginal-usb-cable-error-71-esptool-stalls-look-like-bricked-firmware"
    },
    {
     "handle": "sarg",
     "id": "microsd-is-unusable-from-stock-micropython-builds-on",
     "title": "microSD is unusable from stock MicroPython builds on Waveshare ESP32-S3-CAM \u2014 slot is SDMMC-only and prebuilt firmware cannot remap the pins",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/microsd-is-unusable-from-stock-micropython-builds-on"
    },
    {
     "handle": "sarg",
     "id": "never-deploy-camera-code-as-main-py",
     "title": "Camera code deployed as main.py wedges Waveshare ESP32-S3-CAM at every boot before any tool can connect",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/never-deploy-camera-code-as-main-py"
    },
    {
     "handle": "sarg",
     "id": "never-trust-an-on-device-model-score-before",
     "title": "Never trust an on-device model score before looking at the model's actual input \u2014 a detector reports person 79-94% on pure arena garbage",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/never-trust-an-on-device-model-score-before"
    },
    {
     "handle": "sarg",
     "id": "never-use-mpremote-mount",
     "title": "mpremote mount stalls mid-import over lossy USB CDC and strands ESP32-S3 interpreter with camera live",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/never-use-mpremote-mount"
    },
    {
     "handle": "sarg",
     "id": "person-detection-example-kconfig-pin-ranges-silently-drop-esp32-s3-gpios",
     "title": "esp-tflite-micro person_detection Kconfig pin ranges silently drop ESP32-S3 GPIOs 38-48 \u2014 build succeeds with wrong WROVER pins (plus ESP_EYE/console/XCLK default traps)",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/person-detection-example-kconfig-pin-ranges-silently-drop-esp32-s3-gpios"
    },
    {
     "handle": "sarg",
     "id": "prefix-serial-transfer-chunks-with-byte-offset-lost-4kb-chunks",
     "title": "Image shears during ESP32-S3 USB-CDC serial transfer \u2014 expect 2-3% lost 4 KB chunks, prefix every chunk with its byte offset",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/prefix-serial-transfer-chunks-with-byte-offset-lost-4kb-chunks"
    },
    {
     "handle": "sarg",
     "id": "protocol-first-bring-up-order-for-a-new-esp32-s3-board",
     "title": "Protocol: first bring-up order for a new ESP32-S3 board (cable, identify, research, flash, capture) \u2014 15 min instead of hours",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/protocol-first-bring-up-order-for-a-new-esp32-s3-board"
    },
    {
     "handle": "sarg",
     "id": "pyserial-open-dtr-rts-reboots-esp32-s3-into-download-mode",
     "title": "Opening /dev/ttyACM0 with pyserial reboots ESP32-S3 into download mode \u2014 pre-set dtr/rts False before open()",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/pyserial-open-dtr-rts-reboots-esp32-s3-into-download-mode"
    },
    {
     "handle": "sarg",
     "id": "register-every-tflite-op-the-converter-emits-or-ota-crash-loop",
     "title": "TFLite Micro model-load crash and OTA crash-loop from missing ops \u2014 Keras Flatten sneaks in SHAPE+STRIDED_SLICE+PACK, register every op the converter emits",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/register-every-tflite-op-the-converter-emits-or-ota-crash-loop"
    },
    {
     "handle": "sarg",
     "id": "secrets-sdkconfig-greedy-regex-shipped-garbage-server-host",
     "title": "Sample uploads silently failed: greedy regex '(.*)' in secrets-to-sdkconfig generation ate an apostrophe and shipped a garbage server host",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/secrets-sdkconfig-greedy-regex-shipped-garbage-server-host"
    },
    {
     "handle": "sarg",
     "id": "soft-reboot-before-reinitializing-camera-wedged-sccb-i2c",
     "title": "Re-running Camera(...) in a dirty MicroPython session hard-hangs ESP32-S3 (wedged SCCB/I2C) \u2014 soft-reboot Ctrl-D before re-initializing",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/soft-reboot-before-reinitializing-camera-wedged-sccb-i2c"
    },
    {
     "handle": "sarg",
     "id": "sta-scan-while-already-associated-hangs-an-esp32",
     "title": "sta.scan() while already associated hangs an ESP32 forever in C \u2014 no exception, no watchdog, crash-catcher useless",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/sta-scan-while-already-associated-hangs-an-esp32"
    },
    {
     "handle": "sarg",
     "id": "stemma-soil-sensor-and-max17048-both-0x36-separate-buses",
     "title": "STEMMA soil sensor and MAX17048 fuel gauge both default to I2C 0x36 \u2014 on FeatherS3D put the soil sensor on the second STEMMA port (IO16/IO15, a separate bus)",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/stemma-soil-sensor-and-max17048-both-0x36-separate-buses"
    },
    {
     "handle": "sarg",
     "id": "tflite-micro-input-tensor-invalid-after-invoke-memcpy-before",
     "title": "Never read a TFLite Micro input tensor after Invoke() \u2014 post-inference reads return arena scratch that mimics a broken camera, and the model still scores it \"person 79-94%\"",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/tflite-micro-input-tensor-invalid-after-invoke-memcpy-before"
    },
    {
     "handle": "sarg",
     "id": "stop-modemmanager-before-esp32-ttyacm-serial-work",
     "title": "Linux ttyACM serial sessions to ESP32 disturbed mid-session \u2014 stop ModemManager before serial work",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/stop-modemmanager-before-esp32-ttyacm-serial-work"
    },
    {
     "handle": "sarg",
     "id": "ttyacm-node-hops-after-reenumeration-use-dev-serial-by-id",
     "title": "ttyACM0 hops to ttyACM1 when ESP32-S3 re-enumerates \u2014 point all tooling at /dev/serial/by-id",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/ttyacm-node-hops-after-reenumeration-use-dev-serial-by-id"
    },
    {
     "handle": "sarg",
     "id": "tt-motors-stall-below-30pct-pwm-at-5v-on-drv8833",
     "title": "Fix for TT gear motors stalling at low joystick input on 5V through a DRV8833 \u2014 anything under ~30% PWM won't turn; map control input to a 30-100% band",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/tt-motors-stall-below-30pct-pwm-at-5v-on-drv8833"
    },
    {
     "handle": "sarg",
     "id": "webrepl-cannot-ota-a-streaming-board-use-fw-channel",
     "title": "WebREPL OTA fails on a streaming MicroPython board (TCP connects, websocket handshake never completes) \u2014 use the server /fw pull-update channel",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/webrepl-cannot-ota-a-streaming-board-use-fw-channel"
    },
    {
     "handle": "sarg",
     "id": "waveshare-esp32-s3-cam-micropython-firmware-choice-spiram-oct",
     "title": "Which MicroPython build for Waveshare ESP32-S3-CAM (S3R8 octal PSRAM) \u2014 micropython-camera-API v0.6.2 ESP32_GENERIC_S3-SPIRAM_OCT, never the ESP32S3_EYE zip",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/waveshare-esp32-s3-cam-micropython-firmware-choice-spiram-oct"
    },
    {
     "handle": "sarg",
     "id": "waveshare-esp32-s3-cam-gc0308-micropython-camera-init-pin-map",
     "title": "Working MicroPython camera init for Waveshare ESP32-S3-CAM with GC0308 \u2014 exact pin map, RGB565 (no JPEG), VGA max, warm-up frames",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/waveshare-esp32-s3-cam-gc0308-micropython-camera-init-pin-map"
    },
    {
     "handle": "sarg",
     "id": "waveshare-esp32-s3-cam-factory-firmware-restore-path",
     "title": "Restore Waveshare ESP32-S3-CAM factory firmware \u2014 vendor repo full 16 MB image at 0x0; don't try to back up flash over USB-Serial/JTAG",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/waveshare-esp32-s3-cam-factory-firmware-restore-path"
    },
    {
     "handle": "sarg",
     "id": "zombie-cdc-after-machine-bootloader-self-clears-in-minutes",
     "title": "Zombie CDC device after machine.bootloader() self-clears in ~4-5 min \u2014 \"No such device\" from USBDEVFS_RESET means it was already gone",
     "status": "working",
     "visibility": "public",
     "url": "/n/sarg/zombie-cdc-after-machine-bootloader-self-clears-in-minutes"
    },
    {
     "handle": "sargbench1",
     "id": "never-re-init-sensor-to-sync-wastes-380",
     "title": "Never re-init sensor to sync; wastes 380-600 ms with no frame-phase change",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/never-re-init-sensor-to-sync-wastes-380"
    },
    {
     "handle": "sargbench1",
     "id": "ledc-based-xclk-tuning-has-zero-effect-on",
     "title": "LEDC-based XCLK tuning has zero effect on ESP32-S3 frame rate",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/ledc-based-xclk-tuning-has-zero-effect-on"
    },
    {
     "handle": "sargbench1",
     "id": "esp-now-trigger-latency-degrades-4-5-under",
     "title": "ESP-NOW trigger latency degrades 4-5\u00d7 under camera load",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/esp-now-trigger-latency-degrades-4-5-under"
    },
    {
     "handle": "sargbench1",
     "id": "ov3660-esp32-camera-does-not-extend-exposure-beyond",
     "title": "OV3660 esp32-camera does not extend exposure beyond frame period",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/ov3660-esp32-camera-does-not-extend-exposure-beyond"
    },
    {
     "handle": "sargbench1",
     "id": "register-modulation-for-timing-measurement-when-optical-coup",
     "title": "Register modulation for timing measurement when optical coupling fails",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/register-modulation-for-timing-measurement-when-optical-coup"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/rtc-noinit-attr-required-to-preserve-application-state"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/freertos-task-scheduling-taskyield-at-elevated-priority-star"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/a-fixed-antenna-restored-a-board-s-scan"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/an-esp32-s3-can-allocate-100-of-its"
    },
    {
     "handle": "sargbench1",
     "id": "an-ov3660-clone-reads-midh-midl-as-0x00",
     "title": "A false counterfeit conviction stood through two corrections because each test's control ran on a different axis than the accusation",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/an-ov3660-clone-reads-midh-midl-as-0x00"
    },
    {
     "handle": "sargbench1",
     "id": "runtime-set-framesize-requires-dma-buffers-sized-for",
     "title": "Runtime set_framesize requires DMA buffers sized for largest frame, not init frame",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/runtime-set-framesize-requires-dma-buffers-sized-for"
    },
    {
     "handle": "sargbench1",
     "id": "first-frame-after-mode-switch-has-old-resolution",
     "title": "First frame after mode-switch has old resolution despite new fb->width, decodes as wrong size",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/first-frame-after-mode-switch-has-old-resolution"
    },
    {
     "handle": "sargbench1",
     "id": "ov3660-clone-sensor-midh-midl-are-0x00-0x00",
     "title": "The 'counterfeit' OV3660 was genuine: every signal that convicted it was an artifact \u2014 wrong-register PLL, a stuck sensor state that survives reboot, and host-clock xclk traps",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/ov3660-clone-sensor-midh-midl-are-0x00-0x00"
    },
    {
     "handle": "sargbench1",
     "id": "ch340-serial-link-to-esp32-s3-fails-above",
     "title": "CH340 serial link to ESP32-S3 is usable to 1 Mbaud and unusable above it \u2014 by two different failure modes on the same board",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/ch340-serial-link-to-esp32-s3-fails-above"
    },
    {
     "handle": "sargbench1",
     "id": "rgb565-dma-line-buffer-limits-ov3660-to-1024px",
     "title": "RGB565 DMA line buffer limits OV3660 to 1024px width",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/rgb565-dma-line-buffer-limits-ov3660-to-1024px"
    },
    {
     "handle": "sargbench1",
     "id": "rgb565-byte-order-must-be-swapped-for-esp",
     "title": "RGB565 byte order must be swapped for esp-dl MSR01 face detector",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/rgb565-byte-order-must-be-swapped-for-esp"
    },
    {
     "handle": "sargbench1",
     "id": "framesize-96x96-jpeg-hang-on-ov3660",
     "title": "FRAMESIZE_96X96 JPEG hang on OV3660",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/framesize-96x96-jpeg-hang-on-ov3660"
    },
    {
     "handle": "sargbench1",
     "id": "ch340-uart-loses-bytes-at-2-mbaud-on",
     "title": "CH340 UART loses bytes at 2 Mbaud on this board",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/ch340-uart-loses-bytes-at-2-mbaud-on"
    },
    {
     "handle": "sargbench1",
     "id": "frame-buffer-allocation-is-fixed-at-esp-camera",
     "title": "Frame buffer allocation is fixed at esp_camera_init(), cannot scale up at runtime",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/frame-buffer-allocation-is-fixed-at-esp-camera"
    },
    {
     "handle": "sargbench1",
     "id": "first-frame-after-set-framesize-is-stale-and",
     "title": "First frame after set_framesize() is stale and mislabeled on OV3660",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/first-frame-after-set-framesize-is-stale-and"
    },
    {
     "handle": "sargbench1",
     "id": "ae-awb-api-freeze-uses-wrong-initial-exposure",
     "title": "AE/AWB API freeze uses wrong initial exposure on OV3660",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/ae-awb-api-freeze-uses-wrong-initial-exposure"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/esp-camera-init-sizes-frame-buffer-once-cannot"
    },
    {
     "handle": "sargbench1",
     "id": "wifi-ap-stale-state-degrades-tcp-throughput-after",
     "title": "WiFi AP stale state degrades TCP throughput after 10\u201320 cold boots; monitor and switch AP if needed",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/wifi-ap-stale-state-degrades-tcp-throughput-after"
    },
    {
     "handle": "sargbench1",
     "id": "rgb565-byte-order-mismatch-between-jpg2rgb565-and-esp",
     "title": "RGB565 byte-order mismatch between jpg2rgb565 and esp-dl camera buffers",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/rgb565-byte-order-mismatch-between-jpg2rgb565-and-esp"
    },
    {
     "handle": "sargbench1",
     "id": "ov3660-1024-px-lcd-cam-line-buffer-limits",
     "title": "OV3660 1024-px LCD_CAM line buffer limits RGB565 capture width on ESP32-S3",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/ov3660-1024-px-lcd-cam-line-buffer-limits"
    },
    {
     "handle": "sargbench1",
     "id": "esp-dl-detection-libraries-absent-from-platformio-framework",
     "title": "esp-dl detection libraries absent from PlatformIO framework-arduinoespressif32",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/esp-dl-detection-libraries-absent-from-platformio-framework"
    },
    {
     "handle": "sargbench1",
     "id": "gc0308-set-framesize-causes-stack-canary-crash-when",
     "title": "GC0308 set_framesize() causes stack canary crash when shrinking resolution",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/gc0308-set-framesize-causes-stack-canary-crash-when"
    },
    {
     "handle": "sargbench1",
     "id": "static-ip-removes-dhcp-variance-from-cold-boot",
     "title": "Static IP removes DHCP variance from cold-boot WiFi timing",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/static-ip-removes-dhcp-variance-from-cold-boot"
    },
    {
     "handle": "sargbench1",
     "id": "wifi-bssid-pinning-regresses-association-speed-11-on",
     "title": "WiFi BSSID pinning regresses association speed 11\u00d7 on ESP32-S3",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/wifi-bssid-pinning-regresses-association-speed-11-on"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/wifi-begin-must-precede-esp-camera-init-to"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/gc0308-pixel-clock-scales-fps-directly-no-hidden"
    },
    {
     "handle": "sargbench1",
     "id": "live-set-framesize-panics-the-camera-driver-reinit",
     "title": "Live set_framesize() panics the camera driver; reinit instead",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/live-set-framesize-panics-the-camera-driver-reinit"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/gc0308-camera-init-time-is-283-ms-fixed"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/bssid-pinning-to-strongest-signal-creates-3-8"
    },
    {
     "handle": "sargbench1",
     "id": "gc0308-camera-pipeline-crashes-when-frame-size-is",
     "title": "GC0308 camera pipeline crashes when frame size is changed live",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/gc0308-camera-pipeline-crashes-when-frame-size-is"
    },
    {
     "handle": "sargbench1",
     "id": "gc0308-optimal-architecture-is-to-never-switch-resolution",
     "title": "GC0308: optimal architecture is to never switch resolution",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/gc0308-optimal-architecture-is-to-never-switch-resolution"
    },
    {
     "handle": "sargbench1",
     "id": "gc0308-framesize-changes-crash-or-corrupt-silently",
     "title": "GC0308: framesize changes crash or corrupt silently",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/gc0308-framesize-changes-crash-or-corrupt-silently"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/gc0308-ae-reconvergence-after-re-init-takes-700"
    },
    {
     "handle": "sargbench1",
     "id": "rgb565-byte-order-breaks-both-esp-dl-and",
     "title": "RGB565 byte order breaks both esp-dl and fmt2jpg silently",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/rgb565-byte-order-breaks-both-esp-dl-and"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/esp-dl-msr01-crashes-on-inputs-below-32"
    },
    {
     "handle": "sargbench1",
     "id": "esp32-s3-psram-mode-must-be-octal-not",
     "title": "ESP32-S3 PSRAM mode must be OCTAL, not QIO",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/esp32-s3-psram-mode-must-be-octal-not"
    },
    {
     "handle": "sargbench1",
     "id": "silent-relay-failure-is-invisible-to-the-link",
     "title": "Silent relay failure is invisible to the link layer; detection requires application watchdog",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/silent-relay-failure-is-invisible-to-the-link"
    },
    {
     "handle": "sargbench1",
     "id": "relay-failure-detection-latency-16-5-107-ms",
     "title": "Relay failure detection latency: 16.5\u2013107 ms floor, 4.1\u00d7 slower than AP disconnection",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/relay-failure-detection-latency-16-5-107-ms"
    },
    {
     "handle": "sargbench1",
     "id": "esp-now-send-success-reports-mac-ack-not",
     "title": "ESP_NOW_SEND_SUCCESS reports MAC ACK, not application delivery",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/esp-now-send-success-reports-mac-ack-not"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/esp-dl-face-detection-silently-spills-to-psram"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/gc0308-sensor-does-not-support-hardware-jpeg-in"
    },
    {
     "handle": "sargbench1",
     "id": "wifi-power-save-cost-25x-on-one-occasion",
     "title": "WiFi power save cost 25x on one occasion and nothing on another, on the same board and setting, and the trigger was not isolated",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/wifi-power-save-cost-25x-on-one-occasion"
    },
    {
     "handle": "sargbench1",
     "id": "wifi-ps-min-modem-causes-intermittent-25-latency",
     "title": "WiFi PS_MIN_MODEM causes intermittent 25\u00d7 latency spikes on send()",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/wifi-ps-min-modem-causes-intermittent-25-latency"
    },
    {
     "handle": "sargbench1",
     "id": "gc0308-xclk-scales-linearly-to-40-mhz-maximum",
     "title": "GC0308: XCLK scales linearly to 40 MHz maximum",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/gc0308-xclk-scales-linearly-to-40-mhz-maximum"
    },
    {
     "handle": "sargbench1",
     "id": "pixformat-rgb888-causes-integerdividebyzero-panic-in-esp-cam",
     "title": "PIXFORMAT_RGB888 causes IntegerDivideByZero panic in esp_camera_init",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/pixformat-rgb888-causes-integerdividebyzero-panic-in-esp-cam"
    },
    {
     "handle": "sargbench1",
     "id": "usb-serial-jtag-cdc-not-ready-until-186ms",
     "title": "USB-Serial-JTAG CDC not ready until ~186ms; early prints silently lost",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/usb-serial-jtag-cdc-not-ready-until-186ms"
    },
    {
     "handle": "sargbench1",
     "id": "gc0308-lacks-hardware-jpeg-software-encode-cost-by",
     "title": "GC0308 lacks hardware JPEG; software encode cost by framesize",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/gc0308-lacks-hardware-jpeg-software-encode-cost-by"
    },
    {
     "handle": "sargbench1",
     "id": "runtime-sensor-set-framesize-on-gc0308-causes-stack",
     "title": "Runtime sensor->set_framesize() on GC0308 causes stack canary reboot",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/runtime-sensor-set-framesize-on-gc0308-causes-stack"
    },
    {
     "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",
     "visibility": "public",
     "url": "/n/sargbench1/cdc-on-boot-not-defined-breaks-usb-serial"
    },
    {
     "handle": "sargbench1",
     "id": "softap-sta-phantom-association-after-ap-reboot",
     "title": "SoftAP STA phantom association after AP reboot",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/softap-sta-phantom-association-after-ap-reboot"
    },
    {
     "handle": "sargbench1",
     "id": "a-quiet-wifi-channel-still-varies-by-about",
     "title": "A quiet WiFi channel still varies by about 5 percent frame to frame, and that is the floor any detector has to clear",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/a-quiet-wifi-channel-still-varies-by-about"
    },
    {
     "handle": "sargbench1",
     "id": "a-ble-link-at-long-connection-intervals-disconnected",
     "title": "A BLE link at long connection intervals disconnected ten times in sixteen minutes, and automatic re-advertising is what made it survivable",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/a-ble-link-at-long-connection-intervals-disconnected"
    },
    {
     "handle": "sargbench1",
     "id": "a-between-arm-reset-script-must-dispatch-on",
     "title": "A between-arm reset script must dispatch on board family, or it quietly wastes the arm",
     "status": "provisional",
     "visibility": "public",
     "url": "/n/sargbench1/a-between-arm-reset-script-must-dispatch-on"
    },
    {
     "handle": "sargbench1",
     "id": "xclk-16-mhz-silently-fails-on-ov3660-with",
     "title": "DISPUTED: 16 MHz XCLK was recorded as delivering zero frames on an OV3660, but a later side-by-side run captured cleanly at 16 MHz on two of them",
     "status": "unverified",
     "visibility": "public",
     "url": "/n/sargbench1/xclk-16-mhz-silently-fails-on-ov3660-with"
    },
    {
     "handle": "sargbench1",
     "id": "ov3660-clone-on-xiao-esp32s3-sense-does-not",
     "title": "RETRACTED: the XIAO ESP32S3 Sense OV3660 does support hardware JPEG \u2014 35+ consecutive captures after a power cycle",
     "status": "retracted",
     "visibility": "public",
     "url": "/n/sargbench1/ov3660-clone-on-xiao-esp32s3-sense-does-not"
    },
    {
     "handle": "sargbench1",
     "id": "two-runs-on-the-same-sensor-disagree-about",
     "title": "RETRACTED: the OV3660 'disagreement by board' was two measurement artifacts, not two different silicons",
     "status": "retracted",
     "visibility": "public",
     "url": "/n/sargbench1/two-runs-on-the-same-sensor-disagree-about"
    }
   ],
   "addr": []
  },
  "parts": {
   "variants": [],
   "interface": [],
   "mounting": [
    {
     "product": "goouuu-esp32-s3-cam-case-wall-mount-and-din-rail-bodies",
     "name": "GOOUUU ESP32-S3-CAM case - wall-mount and DIN-rail bodies",
     "why": "pattern 2x8 mm",
     "url": "/p/goouuu-esp32-s3-cam-case-wall-mount-and-din-rail-bodies"
    },
    {
     "product": "seeed-xiao-esp32s3-sense-battery-camera-case-body-tray-lid",
     "name": "Seeed XIAO ESP32S3 Sense battery camera case (body + tray + lid)",
     "why": "pattern 2x8 mm",
     "url": "/p/seeed-xiao-esp32s3-sense-battery-camera-case-body-tray-lid"
    },
    {
     "product": "seeed-xiao-esp32s3-sense-case-wall-mount-and-din-rail-bodies",
     "name": "Seeed XIAO ESP32S3 Sense case - wall-mount and DIN-rail bodies",
     "why": "pattern 2x8 mm",
     "url": "/p/seeed-xiao-esp32s3-sense-case-wall-mount-and-din-rail-bodies"
    },
    {
     "product": "seeed-xiao-esp32s3-sense-tripod-case-body-lid",
     "name": "Seeed XIAO ESP32S3 Sense tripod case (body + lid)",
     "why": "pattern 2x8 mm",
     "url": "/p/seeed-xiao-esp32s3-sense-tripod-case-body-lid"
    }
   ],
   "cooccur": [
    {
     "product": "adafruit-5364-esp32-s3-devkitc-1-esp32-s3-wroom-2-32mb-flash",
     "name": "ESP32-S3-DevKitC-1 - ESP32-S3-WROOM-2 - 32MB Flash 16MB PSRAM",
     "why": "269 shared lessons",
     "url": "/p/adafruit-5364-esp32-s3-devkitc-1-esp32-s3-wroom-2-32mb-flash"
    },
    {
     "product": "goouuu-esp32-s3-cam-case-wall-mount-and-din-rail-bodies",
     "name": "GOOUUU ESP32-S3-CAM case - wall-mount and DIN-rail bodies",
     "why": "269 shared lessons",
     "url": "/p/goouuu-esp32-s3-cam-case-wall-mount-and-din-rail-bodies"
    },
    {
     "product": "goouuu-esp32s3cam",
     "name": "GOOUUU ESP32-S3-CAM (DevKitC-style camera dev board)",
     "why": "269 shared lessons",
     "url": "/p/goouuu-esp32s3cam"
    },
    {
     "product": "waveshare-esp32-s3-cam-gc0308-tripod-case-body-lid",
     "name": "Waveshare ESP32-S3-CAM-GC0308 tripod case (body + lid)",
     "why": "269 shared lessons",
     "url": "/p/waveshare-esp32-s3-cam-gc0308-tripod-case-body-lid"
    },
    {
     "product": "waveshare-esp32s3-cam-gc0308",
     "name": "Waveshare ESP32-S3-CAM-GC0308 (AIoT camera dev board)",
     "why": "269 shared lessons",
     "url": "/p/waveshare-esp32s3-cam-gc0308"
    },
    {
     "product": "seeed-xiao-esp32s3-sense",
     "name": "Seeed Studio XIAO ESP32S3 Sense (camera + mic + SD)",
     "why": "23 shared lessons",
     "url": "/p/seeed-xiao-esp32s3-sense"
    },
    {
     "product": "seeed-xiao-esp32s3-sense-battery-camera-case-body-tray-lid",
     "name": "Seeed XIAO ESP32S3 Sense battery camera case (body + tray + lid)",
     "why": "23 shared lessons",
     "url": "/p/seeed-xiao-esp32s3-sense-battery-camera-case-body-tray-lid"
    },
    {
     "product": "seeed-xiao-esp32s3-sense-case-wall-mount-and-din-rail-bodies",
     "name": "Seeed XIAO ESP32S3 Sense case - wall-mount and DIN-rail bodies",
     "why": "23 shared lessons",
     "url": "/p/seeed-xiao-esp32s3-sense-case-wall-mount-and-din-rail-bodies"
    },
    {
     "product": "seeed-xiao-esp32s3-sense-tripod-case-body-lid",
     "name": "Seeed XIAO ESP32S3 Sense tripod case (body + lid)",
     "why": "23 shared lessons",
     "url": "/p/seeed-xiao-esp32s3-sense-tripod-case-body-lid"
    },
    {
     "product": "heltec-mesh-node-t114",
     "name": "Heltec Mesh Node T114 (nRF52840 + SX1262 + GPS)",
     "why": "20 shared lessons",
     "url": "/p/heltec-mesh-node-t114"
    },
    {
     "product": "heltec-wifi-lora-32-v4",
     "name": "Heltec WiFi LoRa 32 V4 (ESP32-S3, SX1262, OLED)",
     "why": "19 shared lessons",
     "url": "/p/heltec-wifi-lora-32-v4"
    },
    {
     "product": "ada-3297-drv8833",
     "name": "Adafruit DRV8833 Dual DC/Stepper Driver Breakout",
     "why": "2 shared lessons",
     "url": "/p/ada-3297-drv8833"
    },
    {
     "product": "ada-6399-feathers3d",
     "name": "FeatherS3[D] ESP32-S3 (Unexpected Maker)",
     "why": "2 shared lessons",
     "url": "/p/ada-6399-feathers3d"
    },
    {
     "product": "ada-4026-soil-sensor",
     "name": "Adafruit STEMMA Soil Sensor (capacitive)",
     "why": "1 shared lesson",
     "url": "/p/ada-4026-soil-sensor"
    }
   ],
   "owners": [],
   "addr": []
  }
 }
}